web-dev-qa-db-fra.com

Obtenir des données supplémentaires à partir du fournisseur d'identité OAuth / OWin de l'infrastructure MVC5 avec un fournisseur d'authentification externe

J'essaie d'utiliser le nouveau framework MVC5 dans l'aperçu VS 2013.

Le cadre d'authentification des membres a été révisé et remplacé par OWin.

En particulier, j'ai activé le fournisseur d'authentification externe Google auth.

C'était très simple à faire.

Décommentez simplement cette ligne: app.UseGoogleAuthentication(); dans le fichier Startup.Auth.cs dans le répertoire App_Start du nouveau projet MVC par défaut.

Donc, je veux accéder aux "données supplémentaires" qui proviennent du fournisseur d'authentification, comme une URL vers l'avatar de l'utilisateur à afficher dans mon application.

Sous l'ancienne implémentation OAuth contre le fournisseur d'adhésion asp.net, il y avait un moyen de capturer cela en utilisant ce dictionnaire ExtraData trouvé ici: propriété ProviderDetail.ExtraData .

Je ne trouve pas beaucoup de documentation sur la façon dont OAuth et OWin fonctionnent ensemble et comment accéder à ces données supplémentaires.

Quelqu'un peut-il m'éclairer?

30
tony.adx

Récemment, j'ai également dû accéder à la photo du profil Google et voici comment je la résous ...

Si vous activez simplement le code app.UseGoogleAuthentication(); dans le fichier Startup.Auth.cs, cela ne suffit pas, car dans ce cas, Google ne renvoie aucune information sur l'image du profil (ou je n'ai pas compris comment tu piges).

Ce dont vous avez vraiment besoin, c'est d'utiliser l'intégration OAuth2 au lieu d'Open ID qui est activé par défaut. Et voici comment je l'ai fait ...

Tout d'abord, vous devez enregistrer votre application du côté de Google et obtenir "Client ID" et "Client secret". Dès que cela est fait, vous pouvez aller plus loin (vous en aurez besoin plus tard). Informations détaillées sur la façon de procéder ici .

Remplacez app.UseGoogleAuthentication(); par

    var googleOAuth2AuthenticationOptions = new GoogleOAuth2AuthenticationOptions
    {
        ClientId = "<<CLIENT ID FROM GOOGLE>>",
        ClientSecret = "<<CLIENT SECRET FROM GOOGLE>>",
        CallbackPath = new PathString("/Account/ExternalGoogleLoginCallback"),
        Provider = new GoogleOAuth2AuthenticationProvider() {
            OnAuthenticated = async context =>
            {
                context.Identity.AddClaim(new Claim("picture", context.User.GetValue("picture").ToString()));
                context.Identity.AddClaim(new Claim("profile", context.User.GetValue("profile").ToString()));
            }
        }
    };

    googleOAuth2AuthenticationOptions.Scope.Add("email");

    app.UseGoogleAuthentication(googleOAuth2AuthenticationOptions);

Après cela, vous pouvez utiliser le code pour accéder à l'URL de l'image du profil de la même manière que pour toutes les autres propriétés

var externalIdentity = HttpContext.GetOwinContext().Authentication.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
var pictureClaim = externalIdentity.Result.Claims.FirstOrDefault(c => c.Type.Equals("picture"));
var pictureUrl = pictureClaim.Value;
17
Mr. Pumpkin

Avec version RTW d'identité asp.net, le code suivant dans ExternalLoginCallback fait cela pour moi.

var externalIdentity = await HttpContext.GetOwinContext().Authentication
    .GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
var displayName = externalIdentity.Name;
var email = externalIdentity.FindFirstValue(ClaimTypes.Email);
7
aleyush

En utilisant la réponse d'Alex Wheat, j'ai trouvé une solution pour récupérer le profil google +, le sexe et l'e-mail en utilisant l'authentification Google.

Startup.Auth.cs:

var googleOptions = new GoogleOAuth2AuthenticationOptions()
{
    ClientId = "<<client id - google>>",
    ClientSecret = "<<secret for your app>>",
    Provider = new GoogleOAuth2AuthenticationProvider()
    {
        OnAuthenticated = context =>
        {
            var userDetail = context.User;
            context.Identity.AddClaim(new Claim(ClaimTypes.Name,context.Identity.FindFirstValue(ClaimTypes.Name)));
            context.Identity.AddClaim(new Claim(ClaimTypes.Email,context.Identity.FindFirstValue(ClaimTypes.Email)));

            var gender = userDetail.Value<string>("gender");
            context.Identity.AddClaim(new Claim(ClaimTypes.Gender, gender));

            var picture = userDetail.Value<string>("picture");
            context.Identity.AddClaim(new Claim("picture", picture));

            return Task.FromResult(0);
        },
    },
};
googleOptions.Scope.Add("https://www.googleapis.com/auth/plus.login");
googleOptions.Scope.Add("https://www.googleapis.com/auth/userinfo.email");

app.UseGoogleAuthentication(googleOptions);

Pour accéder aux données de profil étendues, vous devez ajouter deux étendues à la demande - plus.login et userinfo.email. Si vous ajoutez uniquement la portée plus.login, vous ne pourrez pas voir l'e-mail de l'utilisateur. Si vous utilisez le modèle par défaut d'ASP.NET MVC5 pour vous authentifier, il n'affichera que l'e-mail, le nom, le prénom et l'adresse de profil google + de l'utilisateur. En utilisant la manière indiquée ici, vous aurez également accès au lien photo de l'utilisateur.

La propriété context.User contient une sérialisation JSON des données de l'utilisateur envoyées via le câble et propose des méthodes utiles pour permettre à l'utilisateur de trouver une propriété par sa clé.

Pour en savoir plus sur le concept des étendues de connexion, veuillez consulter: https://developers.google.com/+/api/oauth#login-scopes

5
Mário Meyrelles

Les articles suivants expliquent comment obtenir des données supplémentaires des fournisseurs sociaux http://blogs.msdn.com/b/webdev/archive/2013/10/16/get-more-information-from-social -providers-used-in-the-vs-2013-project-templates.aspx

4
pranav rastogi

Ce qui suit fonctionne pour moi pour facebook:

StartupAuth.cs:

var facebookAuthenticationOptions = new FacebookAuthenticationOptions()
{
    AppId = "x",
    AppSecret = "y"
};
facebookAuthenticationOptions.Scope.Add("email");
app.UseFacebookAuthentication(facebookAuthenticationOptions);

Méthode ExternalLoginCallback:

var externalIdentity = HttpContext.GetOwinContext().Authentication.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
var emailClaim = externalIdentity.Result.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Email);
var email = emailClaim.Value;

Et pour Google:

StartupAuth.cs

app.UseGoogleAuthentication();

Méthode ExternalLoginCallback (identique à Facebook):

var externalIdentity = HttpContext.GetOwinContext().Authentication.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
var emailClaim = externalIdentity.Result.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Email);
var email = emailClaim.Value;

Si je fixe un point d'arrêt ici:

var email = emailClaim.Value;

Je vois l'adresse e-mail de Facebook et de Google dans le débogueur.

Mise à jour : Voir ce message à la place pour une solution correcte et complète; Obtention de l'e-mail des fournisseurs externes Google et Facebook pendant l'étape d'association de compte dans une application MVC5 par défaut

4
PussInBoots

Donc, malheureusement, ce n'est pas très simple, une façon de le faire est de connecter l'événement authentifié GoogleProvider et d'ajouter une revendication personnalisée à l'identité des revendications avec l'avatar:

public class MyGoogleProvider : GoogleAuthenticationProvider {
    public override Task Authenticated(GoogleAuthenticatedContext context) {
        context.Identity.AddClaim(new Claim("avatarClaim", "<fetch avatar url here>"));
        return base.Authenticated(context);
    }
}

app.UseGoogleAuthentication(new GoogleAuthenticationOptions() { Provider = new MyGoogleProvider() });

Ensuite, à l'intérieur de votre AccountController, lorsque l'identité externe est extraite, vous pouvez prendre cette revendication d'avatar et la stocker dans votre objet utilisateur pour une utilisation ultérieure.

3
Hao Kung

Ici est une bonne réponse d'AndrewPolland. Travaille pour moi. Il utilise le nouveau jeton d'accès oauth pour récupérer les informations utilisateur après la connexion. à partir d'ici Deepak Goswami explique comment utiliser cet appel api.

0
chfumero