web-dev-qa-db-fra.com

Comment ignorer la magie d'Identity Framework et simplement utiliser le middleware d'authentification OWIN pour obtenir les revendications que je recherche?

Le middleware OWIN pour intégrer des connexions tierces à votre application ASP.NET est très cool, mais je n'arrive pas à comprendre comment le retirer du nouveau cadre d'identification qui remplace l'API d'adhésion merdique. Je ne suis pas intéressé par la persistance des revendications résultantes et des informations utilisateur dans cette persistance des données basée sur EF, je veux juste les informations sur les revendications afin de pouvoir les appliquer à mes propres comptes utilisateurs dans les projets existants. Je ne veux pas adopter le nouveau cadre d'identification juste pour profiter de ce genre de choses.

J'ai parcouru le code sur CodePlex, mais il y a beaucoup de magie statique. Pouvez-vous faire des suggestions?

39
Jeff Putz

Utilisez le code suivant pour configurer les middlewares de sécurité OWIN:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = "Application",
    AuthenticationMode = AuthenticationMode.Passive,
    LoginPath = new PathString("/Login"),
    LogoutPath = new PathString("/Logout"),
});

app.SetDefaultSignInAsAuthenticationType("External");

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = "External",
    AuthenticationMode = AuthenticationMode.Passive,
    CookieName = CookieAuthenticationDefaults.CookiePrefix + "External",
    ExpireTimeSpan = TimeSpan.FromMinutes(5),
});

app.UseGoogleAuthentication();

Le code ci-dessus configure les cookies d'application, les cookies externes et les middlewares de connexion externes Google. Le middleware de connexion externe convertit les données de connexion des utilisateurs externes en identité et les définit comme middleware de cookie externe. Dans votre application, vous devez obtenir une identité de cookie externe et la convertir en données de connexion externes, puis vous pouvez la vérifier avec votre utilisateur db.

Voici quelques exemples de code.

Connectez-vous avec le cookie d'application:

var authentication = System.Web.HttpContext.Current.GetOwinContext().Authentication;
var identity = new ClaimsIdentity("Application");
identity.AddClaim(new Claim(ClaimTypes.Name, "<user name>"));
authentication.AuthenticationResponseGrant = new AuthenticationResponseGrant(identity, new AuthenticationProperties() { 
    IsPersistent = false
});

Obtenir l'identité du cookie d'application:

var identity = System.Web.HttpContext.Current.User.Identity as ClaimsIdentity;

Obtenir une identité de cookie externe (Google):

var authentication = System.Web.HttpContext.Current.GetOwinContext().Authentication;
var result = await authentication.AuthenticateAsync("External");
var externalIdentity = result.Identity;

Extraire les données de connexion externes de l'identité:

public static ExternalLoginData FromIdentity(ClaimsIdentity identity)
{
    if (identity == null)
    {
        return null;
    }

    Claim providerKeyClaim = identity.FindFirst(ClaimTypes.NameIdentifier);

    if (providerKeyClaim == null || String.IsNullOrEmpty(providerKeyClaim.Issuer)
        || String.IsNullOrEmpty(providerKeyClaim.Value))
    {
        return null;
    }

    if (providerKeyClaim.Issuer == ClaimsIdentity.DefaultIssuer)
    {
        return null;
    }

    return new ExternalLoginData
    {
        LoginProvider = providerKeyClaim.Issuer,
        ProviderKey = providerKeyClaim.Value,
        UserName = identity.FindFirstValue(ClaimTypes.Name)
    };
}
46
Hongye Sun