J'utilise l'authentification par formulaire et j'envoie une demande Aajx au serveur pour l'authentification. Sur la base du résultat json, le client décide où aller et quoi faire. C'est la raison pour laquelle je n'utilise pas FormsAuthentication.RedirectFromLoginPage pour ne pas interférer avec la réponse ajax/json.
Dans ce cas, Request.IsAuthenticated renvoie false, même après avoir validé l'utilisateur avec Membership.ValidateUser. Ensuite, je mets le cookie en utilisant
FormsAuthentication.SetAuthCookie(username, false);
Bien que le deuxième paramètre, cookie persistant, soit faux, le cookie est toujours valide pour toutes les sessions du navigateur.
Une idée comment faire fonctionner Request.IsAuthenticated sans utiliser FormsAuthentication.RedirectFromLoginPage?
Vous devez mettre à jour le principal de sécurité actuel pour la demande. Lorsque vous appelez Response. Redirect(...)
une nouvelle demande est effectuée et le principal de sécurité est réinitialisé et Request.IsAuthenticated renvoie true dans votre cas. FormsAuthentication.RedirectFromLoginPage
Appelle en interne Response. Redirect(...)
. Vous pouvez renouveler manuellement le principal de sécurité pour la demande actuelle comme ceci:
public void RenewCurrentUser()
{
System.Web.HttpCookie authCookie =
System.Web.HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
FormsAuthenticationTicket authTicket = null;
authTicket = FormsAuthentication.Decrypt(authCookie.Value);
if (authTicket != null && !authTicket.Expired)
{
FormsAuthenticationTicket newAuthTicket = authTicket;
if (FormsAuthentication.SlidingExpiration)
{
newAuthTicket = FormsAuthentication.RenewTicketIfOld(authTicket);
}
string userData = newAuthTicket.UserData;
string[] roles = userData.Split(',');
System.Web.HttpContext.Current.User =
new System.Security.Principal.GenericPrincipal(new FormsIdentity(newAuthTicket), roles);
}
}
}
FormsAuthentication.SetAuthCookie
Méthode Crée un ticket d'authentification pour le nom d'utilisateur fourni et l'ajoute à la collection de cookies de la réponse, ou à l'URL si vous utilisez l'authentification sans cookie.
Réf: msdn
Jetez un œil au Flux de contrôle de l'authentification par formulaire . Le cookie d'authentification est défini sur la collection de cookies de réponse et doit être observable au niveau du protocole http (par exemple, utilisez FireCookie ou Fiddler2 pour le vérifier).
L'adhésion vérifie uniquement un nom d'utilisateur/mot de passe. Ni l'appartenance ni SetAuthCookie()
ne modifiera la demande en cours. Ils s'attendent à renvoyer le cookie à l'appelant, et la demande suivante est lorsque les propriétés comme IsAuthenticated
retourneront true.
Notez que vous pouvez remplacer et étendre ces processus automatiques à l'aide de IIdentity
et IPrincipal
personnalisés, et vous connecter aux événements d'authentification Si tu as besoin de.
Jetez également un œil à tilisation de l'authentification par formulaire avec ASP.NET AJAX
Rediriger après un POST est la meilleure pratique et doit être considéré comme la bonne solution.
Dans certains cas, vous souhaiterez peut-être toujours savoir si un utilisateur est authentifié dans le cadre de la demande d'authentification (par exemple, si vous exécutez une logique supplémentaire après l'authentification, qui est partagée avec d'autres demandes).
Dans ce cas, vous pouvez réinitialiser la valeur de Request.IsAuthenticated avec le code suivant:
// set the forms auth cookie
FormsAuthentication.SetAuthCookie(username, createPersistentCookie);
// reset request.isauthenticated
var authCookie = System.Web.HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
if (authTicket != null && !authTicket.Expired)
{
var roles = authTicket.UserData.Split(',');
System.Web.HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(new FormsIdentity(authTicket), roles);
}
}
Voir le post ici: http://abadjimarinov.net/blog/2010/01/24/RenewUserInTheSameRequestInAspdotNET.xhtml
nous pouvons l'utiliser simplement
FormsAuthentication.SetAuthCookie (nom d'utilisateur, vrai);