web-dev-qa-db-fra.com

Comment définir Request.IsAuthenticated sur true lorsque vous n'utilisez pas FormsAuthentication.RedirectFromLoginPage?

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?

27
Amin Emami

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

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

20
Robert Paulson

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

2
zcrar70

nous pouvons l'utiliser simplement

FormsAuthentication.SetAuthCookie (nom d'utilisateur, vrai);

0
Nandam Siva