web-dev-qa-db-fra.com

UseCookieAuthentication vs. UseExternalSignInCookie

J'utilise Owin pour autoriser via Google oAuth. Voici comment mes cookies sont configurés:

// Enable the application to use a cookie to store information for the signed in user
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Authentication/Login")
});
// Use a cookie to temporarily store information about a user logging in with a third party login provider
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

J'utilise donc à la fois UseCookieAuthentication et UseExternalSignInCookie et cela semble redondant. Lequel de ces deux AuthenticationTypes dois-je spécifier pour les méthodes IAuthenticationManager (SignIn, SingOUt, etc.)? Ou devrais-je en garder un seul?

pdate. Ce qui m'embrouille le plus, c'est la méthode SignIn:

private async Task SignInAsync(ApplicationUser user, bool isPersistent)
{
    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
    var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
    AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
}

Déconnexion de ExternalCookie, mais connexion à ApplicationCookie.

48
SiberianGuy

Vous avez besoin de chacun d'eux, si vous voulez que la connexion Google fonctionne. Voilà comment cela fonctionne. Dans le pipeline OWIN, vous disposez de trois composants middleware: (1) le middleware d'authentification des cookies s'exécutant en mode actif, (2) une autre instance du middleware d'authentification des cookies mais s'exécutant en mode passif, et (3) le middleware d'authentification Google. Ce sera comme ça.

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    ...
}); // Active

app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); // Passive

app.UseGoogleAuthentication(...);

Lorsqu'il y a un 401, votre utilisateur est redirigé vers Google. Là, votre utilisateur se connecte et Google valide les informations d'identification. Google redirige ensuite l'utilisateur vers votre application. À ce stade, le middleware d'authentification Google obtient les informations de connexion, applique une autorisation (lire le cookie externe) et court-circuite le pipeline OWIN et redirige vers l'URL de rappel externe, qui correspond à la méthode d'action ExternalLoginCallback de AccountController. Ainsi, à ce stade, lorsque la demande parvient à votre application à la suite d'une redirection, vous obtenez le cookie externe avec le nom d'utilisateur et les réclamations par e-mail.

Afin de lire ce cookie et de récupérer les données (nom d'utilisateur, etc.) de Google, vous utilisez le middleware d'authentification des cookies fonctionnant en mode passif. Comme ce middleware fonctionne en mode passif, il faut lui dire de lire le cookie. C'est ce qui se passe lorsque l'appel à AuthenticationManager.GetExternalLoginInfoAsync() est effectué dans la méthode d'action ExternalLoginCallback. À ce stade, l'identité du cookie externe a été établie et cette identité ne contient que le nom et les réclamations par e-mail de Google.

En règle générale, à ce stade, vous devrez récupérer des informations spécifiques à l'utilisateur dans le magasin de données de votre application et ajouter plus de revendications à l'identité. Ainsi, vous appelez Signout sur le middleware de cookie externe, ce qui garantira également que le cookie externe ne sera plus renvoyé en l'expirant. Ainsi, en utilisant les informations d'identité disponibles à ce moment, UserManager.FindAsync Est appelé dans la méthode d'action ExternalLoginCallback, qui doit renvoyer l'utilisateur avec toutes les revendications spécifiques à l'application. En utilisant cette nouvelle identité, vous appelez SignIn sur le middleware d'authentification des cookies s'exécutant en mode actif. Cela garantit qu'un nouveau cookie est créé. Comparé au cookie externe, ce nouveau cookie contient toutes les revendications spécifiques à l'application. Par la suite, vous récupérez ce cookie et le middleware d'authentification de cookie s'exécutant en mode actif lit activement le cookie et établit l'identité avec la liste complète de toutes les revendications spécifiques à l'application.

Donc, si vous n'appelez pas Signin, vous ne créerez pas ce cookie contenant toutes les revendications spécifiques à l'application. Mais ensuite, c'est à vous d'utiliser un autre mécanisme. Le comportement prêt à l'emploi est qu'un cookie local contenant toutes les revendications spécifiques à l'application est créé via cet appel à SignIn et lu ensuite par le middleware de cookie s'exécutant en mode actif.

MISE À JOUR: J'ai créé un article de blog pour expliquer comment vous pouvez vous en sortir sans utiliser deux instances de middleware de cookie. http://lbadri.wordpress.com/2014/10/14/barebones-asp-net-mvc-google-signin-through-owin-middleware/

87
Badri

"SignOut (DefaultAuthenticationTypes.ExternalCookie)" consiste à "nettoyer, le cookie externe" selon la réponse de Hao Kung https://stackoverflow.com/a/20575643/2710179

Il existe une implémentation de Nice dans le projet Microsoft.aspnet.identity.samples que vous pouvez télécharger à partir de nuget. Dans cette mise en œuvre, ils utilisent: -

    var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);

"ExternalCookie" est la "valeur par défaut utilisée pour le ExternalSignInAuthenticationType configuré"

7
Jonathan Jansen