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
?
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:
Le client envoie son nom d'utilisateur et son mot de passe.
Le serveur l'obtient et le vérifie. S'ils sont valides, le serveur envoie Set-Cookie
en-tête au client.
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
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>
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>