HttpContext.Current.User.Identity.Name всегда является строкой. Пусто - PullRequest
26 голосов
/ 29 июня 2009

Привет! Я использую пользовательский MembershipProvider.

Я хочу знать текущее имя пользователя в сценарии приложения, но когда я пытаюсь получить доступ к 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);
}

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

Ответы [ 7 ]

34 голосов
/ 29 июня 2009
FormsAuthentication.SetAuthCookie(tbUsername.Text, true);
bool x = User.Identity.IsAuthenticated; //true
string y = User.Identity.Name; //""

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

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

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

22 голосов
/ 24 сентября 2012

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

8 голосов
/ 29 июня 2009

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

2 голосов
/ 31 марта 2016

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

<modules>
  <remove name="FormsAuthentication"/>
</modules>
1 голос
/ 17 февраля 2014

Как уже предлагалось, метод FormsAuthentication.RedirectFromLoginPage() устанавливает файл cookie аутентификации автоматически.

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

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

0 голосов
/ 09 апреля 2014

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

0 голосов
/ 29 июня 2009

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

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