HttpContext.Current.User.Identity.Name всегда является строкой. Пусто

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

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

Проблема, с которой вы столкнулись, заключается в том, что на данный момент вы устанавливаете только куки аутентификации, IPrincipal, который создается внутри модуля аутентификации форм, не будет происходить до тех пор, пока не появится новый запрос - поэтому в этот момент HttpContext.User находится в странном состоянии., Как только произойдет перенаправление, потому что это новый запрос от браузера, 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.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-адреса или измените свой URL-адрес, это может быть причиной возврата пустого значения NULL. Вам следует попробовать изменить путь вашего URL-адреса с.html на.aspx или без расширения. это проблема для моего случая. Вы пытаетесь. Я надеюсь, что это полезно

Другие вопросы по тегам