2009-06-29 7 views
23

Привет Я использую пользовательский MemberhipProvider.HttpContext.Current.User.Identity.Name всегда string.Empty

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

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

+0

этот код кажется простой достаточно. вы уверены, что пользователь аутентифицирован? любой смешной бизнес с изменением поставщика динамически или некоторыми такими? –

+0

no funny bizniz ,, пользователь аутентифицирован – Shimmy

+0

Вы установили имя пользователя в файл cookie с аутентификацией FormsAuthentication.SetAuthCookie? –

ответ

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

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

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

Как и в сторону RedirectFromLoginPage создает формы аутентификации печенье в любом случае, вам не нужно делать это вручную

+0

это хороший момент. проверяете ли вы имя пользователя на той же странице, которая устанавливает cookie/выполняет вход? если это так, проверьте HttpContext.Current.User.Identity на * последующей * странице. –

+0

очень хороший ответ. Но это не помогает мне с моей проблемой. Я хочу, чтобы иметь возможность перенаправить пользователя на определенную страницу на основе роли пользователя. Администратор непосредственно на панели администратора, обычный пользователь, чтобы приветствовать страницу, продвинутый пользователь на определенную другую страницу ... Я надеялся использовать User.IsInRole(), чтобы определить ActionResult метода действия LogOn ... но он «в странное состояние ", как вы выразились :-) –

0

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

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

Если мне нужно, скорее, имя пользователя, то я могу просто использовать Membership.GetUser(); : <| – Shimmy

8

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

19

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

+1

Это что-то другое. Когда я прочитаю это значение на своем веб-сайте, я получаю свою учетную запись Windows (AD) ... – Jowen

+1

Если User.Identity.Name пуст, и вы ожидаете, что этого не будет, но LogonUserIdentity.Name не будет, у вас может возникнуть проблема с вашим applicationhost.config, если вы отлаживаете Visual Studio. См. Мой вопрос SO для получения дополнительной информации. http://stackoverflow.com/questions/19686933/logonuseridentity-name-vs-user-identity-name/19689343#19689343 – Jagd

+0

Да, я согласен с Jowen .. Это не то же самое, что и то, о чем просили ... но это здорово, что доступно, я полагаю. – ppumkin

1

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

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

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

0

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

2

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^