User.Identity.IsAuthenticated ложно после успешного входа в систему
Мне нужно получить UserId Guid сразу после успешного входа в систему. Следующий код не работает:
if (Membership.ValidateUser(txtUsername.Value, txtPassword.Value))
{
FormsAuthentication.SignOut();
FormsAuthentication.SetAuthCookie(txtUsername.Value, true);
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
// doesn't run
Guid puk = (Guid)Membership.GetUser().ProviderUserKey;
}
}
Следующий код работает:
if (Membership.ValidateUser(txtUsername.Value, txtPassword.Value))
{
FormsAuthentication.SignOut();
FormsAuthentication.SetAuthCookie(txtUsername.Value, true);
MembershipUser user = Membership.GetUser(txtUsername.Value);
if (user != null)
{
Guid puk = (Guid)user.ProviderUserKey;
}
}
Почему это происходит? Есть ли что-то еще, кроме SetAuthCookie
?
Ответы
Ответ 1
Потому что, когда вы вызываете FormsAuthentication.SetAuthCookie(txtUsername.Value, true);
, вы храните ключ в клиенте клиента. Для этого вам нужно сделать ответ пользователю.
А для HttpContext.Current.User.Identity
для заполнения cookie вам потребуется еще один запрос.
Короче ваша схема выглядит так:
-
Клиент отправляет свое имя пользователя и пароль.
-
Сервер получает и проверяет его. Если они действительны, сервер отправляет Set-Cookie
заголовок клиенту.
-
Клиент получает и сохраняет его. Для каждого запроса клиент отправляет файлы cookie обратно на сервер.
UPDATE для @Jake
Добавление примера установки User
в HttpContext
var identity = new System.Security.Principal.GenericIdentity(user.UserName);
var principal = new GenericPrincipal(identity, new string[0]);
HttpContext.Current.User = principal;
Thread.CurrentPrincipal = principal;
Обратите внимание, что вы можете создать свой собственный основной класс, наследующий от GenericPrincipal
или ClaimsPrincipal
Ответ 2
У меня была такая же проблема. Я забыл установить конфигурацию web.config.
Возможно, вы тоже пропустили.
<system.web>
<authentication mode="Forms">
<forms loginUrl="~/user/login" timeout="1000" name="__Auth" />
</authentication>
</system.web>
Ответ 3
Я пробовал все вышеупомянутые решения, но то, что решает мою проблему, было комментировать это в web.config
<modules>
<remove name="FormsAuthentication"/>
</modules>