Подтвердить что ты не робот

HttpContext.Current.User.Identity.Name всегда string.Empty

Привет, я использую пользовательский MemberhipProvider.

Я хочу узнать текущее имя пользователя во время сценария приложения, но когда я пытаюсь получить доступ к HttpContext.Current.User.Identity.Name, он всегда возвращает string.Empty.

if (Membership.ValidateUser(tbUsername.Text, tbPassword.Text))
{
    FormsAuthentication.SetAuthCookie(tbUsername.Text, true);
    bool x = User.Identity.IsAuthenticated; //true
    string y = User.Identity.Name; //""
    FormsAuthentication.RedirectFromLoginPage(tbUsername.Text, cbRememberMe.Checked);
}

Я что-то пропустил?

4b9b3361

Ответ 1

FormsAuthentication.SetAuthCookie(tbUsername.Text, true);
bool x = User.Identity.IsAuthenticated; //true
string y = User.Identity.Name; //""

Проблема заключается в том, что вы устанавливаете только cookie проверки подлинности, IPrincipal, который создается внутри модуля проверки подлинности форм, не будет выполняться до тех пор, пока не появится новый запрос - поэтому в этот момент HttpContext.User находится в странное состояние. Как только перенаправление произойдет тогда, потому что это новый запрос от браузера, cookie будет прочитан до того, как ваша страница будет достигнута, и создаст правильный пользовательский объект.

Cookies устанавливаются только в браузере после завершения запроса.

В качестве альтернативы RedirectFromLoginPage в любом случае создает файл cookie с форматом, вам не нужно делать это вручную

Ответ 2

Попробуйте System.Web.HttpContext.Current.Request.LogonUserIdentity.Name вместо User.Identity.Name. Это сработало для меня.

Ответ 3

Значение HttpContext.Current.User.Identity.Name устанавливается вызовом RedirectFromLoginPage. Вы можете получить текущий идентификатор пользователя с HttpContext.Current.User.Identity.Name после перенаправления на новую страницу. Я не уверен, почему вам нужно будет получить доступ к имени пользователя через свойство User в этом контексте, не могли бы вы просто использовать значение, содержащееся в tbUsername.Text?

Ответ 4

в версии VS Community 2015, если вы создаете приложение веб-форм, оно автоматически добавляет коды в web.config node для удаления FormsAuthentication, попробуйте удалить ниже раздел

<modules>
  <remove name="FormsAuthentication"/>
</modules>

Ответ 5

Как уже было сказано, метод FormsAuthentication.RedirectFromLoginPage() автоматически устанавливает Cookie Authentication.

Однако в моем случае у меня были вложенные веб-приложения, где я очистил тег <httpModules> в дочернем приложении (так, чтобы он не наследовал httpModules из его родительского приложения) в файле web.config. Удаление нежелательных родительских httpModules заставило все работать снова.

лучше проверить этот тег перед усложнением:)

Ответ 6

Если вы ищете имя пользователя из поставщика членства, попробуйте что-то вроде этого...

var user = Membership.GetUser( HttpContext.Current.User.Identity.Name );

Ответ 7

Если вы используете переписывание URL или изменяете свой URL, это может быть причиной возврата Пустое значение null. Вы должны попробовать изменить путь своего URL-адреса с .html на .aspx или none extendtion. это вопрос для моего дела. Вы пытаетесь. Я надеюсь, что это полезно