Подтвердить что ты не робот

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?

4b9b3361

Ответ 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>