web-dev-qa-db-fra.com

User.Identity.IsAuthenticated est faux après une connexion réussie

J'ai besoin d'obtenir le UserId Guid directement après une connexion réussie. Le code suivant ne fonctionne pas:

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;            
    }
}

Le code suivant fonctionne:

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;
    }
}

Pourquoi cela arrive-t-il? Y a-t-il autre chose à faire en plus de SetAuthCookie?

25
user982119

Parce que lorsque vous appelez FormsAuthentication.SetAuthCookie(txtUsername.Value, true); vous stockez la clé sur les cookies du client. Pour cela, vous devez faire une réponse à l'utilisateur. Et pour HttpContext.Current.User.Identity pour être rempli de cookies, vous avez besoin d'une demande supplémentaire.

En bref, votre schéma ressemble à ceci:

  1. Le client envoie son nom d'utilisateur et son mot de passe.

  2. Le serveur l'obtient et le vérifie. S'ils sont valides, le serveur envoie Set-Cookie en-tête au client.

  3. Le client le reçoit et le stocke. Pour chaque demande, le client renvoie des cookies au serveur.

MISE À JOUR pour @Jake

Ajout d'un exemple de définition de User dans 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;  

Notez que vous pouvez créer votre classe principale personnalisée héritant de GenericPrincipal ou ClaimsPrincipal

16
Oleksii Aza

J'ai aussi eu le même problème. J'ai oublié de définir la configuration web.config.

Peut-être que vous avez manqué aussi.

   <system.web> 
    <authentication mode="Forms">
      <forms loginUrl="~/user/login" timeout="1000" name="__Auth" />
    </authentication>  
  </system.web> 
24
cihancoskun

Dans mon cas d'environnement de développement, la propriété requireSSL était définie sur true, j'ai résolu le problème en la changeant en requireSSL = false.

enter image description here

1
doganak

J'ai essayé toutes les solutions ci-dessus, mais la chose qui résout mon problème était de commenter cela dans web.config

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