web-dev-qa-db-fra.com

Comment se déconnecter des fournisseurs Owin?

Je suis ce tutoriel mais cela ne vous dit pas comment vous déconnecter. J'ai essayé de faire 

Request.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ExternalCookie);

Request.GetOwinContext().Authentication.SignOut()

          Request.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ApplicationCookie);

Vous pouvez obtenir l'exemple de code ici: https://github.com/AndersAbel/SocialLoginWithoutIdentity

Juste besoin d'ajouter une action supplémentaire

public ActionResult SignOut()
 {
       Request.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ExternalCookie);
       return RedirectToAction("Index", "Home");
 }

Cette méthode, plus l'une des 3 lignes de j'ai posté ci-dessus 

Mon résultat actuel est: je me connecte, je vais à la page sécurisée et je peux la voir, puis je passe à ma fermeture de session, puis après la fermeture de session, essayez de revenir à la page sécurisée.

Donc, en fait, il ne m'a pas vraiment quitté.

16
chobo2

Comme mentionné dans le tutoriel, les middleWare utilisés utilisent le type d'authentification par défaut mais ne le remplacent pas. 

En utilisant uniquement externalCookie comme paramètre pour Owin, vous effacez le cookie pour Asp, mais pas celui utilisé pour stocker le fournisseur Google

pour ce faire, vous devrez obtenir la liste de tous les cookies actuels . Cela peut être fait facilement, comme ceci:

Request.GetOwinContext()
       .Authentication
       .SignOut(HttpContext.GetOwinContext()
                           .Authentication.GetAuthenticationTypes()
                           .Select(o => o.AuthenticationType).ToArray());

C'est ici que cela est dit dans le tutoriel:

L’appel à UseGoogleAuthentication devrait expliquer pourquoi il est nécessaire. 

Mais le premier toSetDefaultSignInAsAuthenticationType n'est pas en tant que évident. Le middleware de connexion repose normalement sur le middleware de cookie externe enregistré avant le middleware de connexion sociale. middleware externe des cookies, il se définit comme le type de connexion par défaut . C’est ainsi que le middleware de connexion sociale sait qu’il doit utiliser le fichier cookie externe. Dans cette configuration, il n'y a pas de cookie externe, nous avons donc définir manuellement le middleware de cookie principal en tant que type de connexion par défaut. Le middleware de cookie émettra un cookie uniquement si le fichier AuthenticationType correspond à celui de l'identité créée par le middleware de connexion sociale. En regardant le pipeline d’authentification externe owin un réseau social dans la

16
GaelSa

Essayez de définir les en-têtes de contrôle du cache.

public ActionResult SignOut() {
    var authenticationTypes = new string[] {
        DefaultAuthenticationTypes.ApplicationCookie,  
        DefaultAuthenticationTypes.ExternalCookie 
    };
    AuthenticationManager.SignOut(authenticationTypes);
    // HACK: Prevent user from being able to go back to a logged in page once logged out
    Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.Cache.SetNoStore();
    // now redirect
    return RedirectToAction("Index", "Home");    
}

private IAuthenticationManager AuthenticationManager {
    get {
        return Request.GetOwinContext().Authentication;
    }
}

Vous ne pouvez pas arrêter l'utilisateur en cliquant sur le bouton Précédent du navigateur, à moins que vous n'utilisiez JavaScript, qui peut être désactivé. L'utilisateur peut revenir en arrière dans une page et afficher ce qui était sur la page précédente, mais s'il tente de cliquer sur des liens protégés ou d'actualiser la page, il sera redirigé pour se connecter.

3
Nkosi

Utilisez l'attribut [Autoriser] sur les classes nécessitant une autorisation:

 [Authorize]
public class MeController : ApiController
{
    // GET api/<controller>
    public IEnumerable<object> Get()
    {
        var identity = User.Identity as ClaimsIdentity;
        return identity.Claims.Select(c => new
        {
            Type = c.Type,
            Value = c.Value
        });
    }
}

source: http://www.asp.net/aspnet/overview/owin-and-katana/owin-oauth-20-authorization-server

0
Jeroen Doppenberg