HttpContext.Текущий.пользователь.Идентификатор.Имя всегда является строкой.Пустое

StackOverflow https://stackoverflow.com/questions/1056487

Вопрос

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

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

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);
}

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top