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

Привет, я использую пользовательский 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);
}

Я что-то упускаю?


person Shimmy Weitzhandler    schedule 29.06.2009    source источник
comment
этот код кажется достаточно простым. вы уверены, что пользователь аутентифицирован? какие-нибудь забавные дела с динамической сменой провайдера или что-то в этом роде?   -  person Matt Sherman    schedule 29.06.2009
comment
нет смешного бизнеса, пользователь аутентифицирован   -  person Shimmy Weitzhandler    schedule 29.06.2009
comment
Вы установили имя пользователя в файле cookie аутентификации с помощью FormsAuthentication.SetAuthCookie?   -  person Joe Chung    schedule 29.06.2009
comment
Как вы отправляете свои файлы cookie? В каком методе вы вызываете приведенный выше код?   -  person Phaedrus    schedule 29.06.2009
comment
Я отредактировал свой ответ, проверьте сейчас....   -  person Muhammad Akhtar    schedule 29.06.2009


Ответы (7)


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

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

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

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

person blowdart    schedule 29.06.2009
comment
Это хороший момент. вы проверяете имя пользователя на той же странице, которая устанавливает cookie/выполняет вход? если это так, проверьте HttpContext.Current.User.Identity на последующей странице. - person Matt Sherman; 29.06.2009
comment
очень хороший ответ. Но это мало помогает мне в моей проблеме. Я хочу иметь возможность перенаправить пользователя на определенную страницу в зависимости от роли пользователя. Администратор прямо на панель администратора, обычный пользователь на страницу приветствия, продвинутый пользователь на определенную другую страницу... Я надеялся использовать User.IsInRole() для определения ActionResult метода действия LogOn... но это в странное состояние, как вы выразились :-) - person Peter Perháč; 05.01.2011

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

person sathya    schedule 24.09.2012
comment
Это что-то другое. Когда я читаю это значение на своем веб-сайте, я получаю свою учетную запись Windows (AD) ... - person Jowen; 22.01.2013
comment
Если User.Identity.Name пуст, и вы ожидаете, что это не так, а LogonUserIdentity.Name — нет, то у вас может возникнуть проблема с вашим applicationhost.config, если вы выполняете отладку вне Visual Studio. См. мой вопрос SO для получения дополнительной информации. stackoverflow.com/questions/ 19686933/ - person Jagd; 30.10.2013
comment
Да, я согласен с Джоуэн.. Это не та идентичность, о которой просили... но, полагаю, это круто, что доступно. - person Piotr Kula; 06.03.2017

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

person Phaedrus    schedule 29.06.2009

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

<modules>
  <remove name="FormsAuthentication"/>
</modules>
person Bo Hu    schedule 31.03.2016

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

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

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

person Bravo    schedule 17.02.2014

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

var user = Membership.GetUser( HttpContext.Current.User.Identity.Name );
person JP Alioto    schedule 29.06.2009
comment
Если мне нужен пользователь, а не имя пользователя, я мог бы просто использовать Membership.GetUser(); :‹| - person Shimmy Weitzhandler; 29.06.2009

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

person Hoang Quan    schedule 09.04.2014