Вопрос по httpcontext, asp.net, custom-membershipprovider, iidentity – HttpContext.Current.User.Identity.Name всегда является строкой. Пусто

26

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

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

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

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

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

Ваш Ответ

7   ответов
8

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

2

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

<modules>
  <remove name="FormsAuthentication"/>
</modules>
34
FormsAuthentication.SetAuthCookie(tbUsername.Text, true);
bool x = User.Identity.IsAuthenticated; //true
string y = User.Identity.Name; //""

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

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

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

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

FormsAuthentication.RedirectFromLoginPage() метод, автоматически устанавливает Cookie для аутентификации.

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

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

21

System.Web.HttpContext.Current.Request.LogonUserIdentity.Name вместо тогоUser.Identity.Name. У меня это сработало.

Это что-то другое. Когда я читаю это значение на своем веб-сайте, я получаю свою учетную запись Windows (AD) ... Jowen
Если User.Identity.Name пусто, и вы ожидаете, что это не так, но LogonUserIdentity.Name нет, то у вас может быть проблема с вашим applicationhost.config, если вы отлаживаете из Visual Studio. Смотрите мой так вопрос для получения дополнительной информации. / Stackoverflow.com вопросы / 19686933 / ... Jagd
Да, я согласен с Джовеном. Это не та же самая идентичность, о которой просили ... но, к сожалению, она доступна. ppumkin
0

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

0

попробуйте что-то вроде этого ...

var user = Membership.GetUser( HttpContext.Current.User.Identity.Name );
Если мне нужен пользователь, а не имя пользователя, я мог бы просто использовать Membership.GetUser (); : <| Shimmy

Похожие вопросы