web-dev-qa-db-fra.com

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

Apparemment, vous pouvez le faire avec le fournisseur Facebook en ajoutant des étendues à l'objet FacebookAuthenticationOptions dans Startup.Auth.cs:

http://blogs.msdn.com/b/webdev/archive/2013/10/16/get-more-information-from-social-providers-used-in-the-vs-2013-project- templates.aspx

List<string> scope = new List<string>() { "email" };
var x = new FacebookAuthenticationOptions();
x.Scope.Add("email");
...
app.UseFacebookAuthentication(x);

Comment faire de même avec le fournisseur Google? Il n'y a pas de x.Scope propriété pour la classe/l'objet GoogleAuthenticationOptions!

25
PussInBoots

VEUILLEZ VOIR LES MISES À JOUR AT LE FOND DE CE POST!

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 1 : L'ancienne réponse m'avait confus alors je l'ai mise à jour avec le code que j'ai dans mon propre projet que je viens de déboguer et je sais que ça marche.

Mise à jour 2 : Avec la nouvelle version ASP.NET Identity 2.0 RTM , vous n'avez plus besoin du code de cet article. La bonne façon d'obtenir l'e-mail est simplement la suivante:

  1. Startup.Auth.cs

        app.UseFacebookAuthentication(
           appId: "x",
           appSecret: "y");
    
        app.UseGoogleAuthentication();
    
  2. AccountController.cs

    //
    // GET: /Account/ExternalLoginCallback
    [AllowAnonymous]
    public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
    {
        var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
        if (loginInfo == null)
        {
            return RedirectToAction("Login");
        }
    
        // Sign in the user with this external login provider if the user already has a login
        var result = await SignInHelper.ExternalSignIn(loginInfo, isPersistent: false);
        switch (result)
        {
            case SignInStatus.Success:
                return RedirectToLocal(returnUrl);
            case SignInStatus.LockedOut:
                return View("Lockout");
            case SignInStatus.RequiresTwoFactorAuthentication:
                return RedirectToAction("SendCode", new { ReturnUrl = returnUrl });
            case SignInStatus.Failure:
            default:
                // If the user does not have an account, then Prompt the user to create an account
                ViewBag.ReturnUrl = returnUrl;
                ViewBag.LoginProvider = loginInfo.Login.LoginProvider;
                return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = loginInfo.Email });
        }
    }
    
47
PussInBoots

Vous devez configurer explicitement les FacebookAuthenticationOptions pour obtenir l'adresse e-mail de l'utilisateur authentifié.

Dans votre projet MVC5, ajoutez ces lignes dans Startup.Auth.cs

        var options = new FacebookAuthenticationOptions() {
            AppId = "xxxxxxxx",
            AppSecret = "xxxxxxxxx"
        };
        options.Scope.Add("email");
        app.UseFacebookAuthentication(options);

pdate Réduit mon exemple de code au minimum absolu. Au fait, votre code mis à jour fonctionne bien, je l'ai également essayé avec Facebook et Google.

6
pedrusky

Dans l'authentification Facebook ASP.NET Core, le middleware Facebook ne semble plus passer dans l'e-mail, même si vous l'ajoutez à la portée. Vous pouvez contourner ce problème en utilisant l'API graphique de Facebook pour demander l'e-mail.

Vous pouvez utiliser n'importe quel client Facebook Graph Api ou lancer le vôtre, et l'utiliser pour appeler l'API Graph comme suit:

app.UseFacebookAuthentication(options =>
{
    options.AppId = Configuration["Authentication:Facebook:AppId"];
    options.AppSecret = Configuration["Authentication:Facebook:AppSecret"];

    options.Scope.Add("public_profile");
    options.Scope.Add("email");

    options.Events = new OAuthEvents
    {
        OnCreatingTicket = context => {
            // Use the Facebook Graph Api to get the user's email address
            // and add it to the email claim

            var client = new FacebookClient(context.AccessToken);
            dynamic info = client.Get("me", new { fields = "name,id,email" });

            context.Identity.AddClaim(new Claim(ClaimTypes.Email, info.email));
            return Task.FromResult(0);
        }
    };
});

Vous pouvez trouver un exemple plus détaillé sur la façon de l'utiliser ici: http://zainrizvi.io/2016/03/24/create-site-with-facebook-login-using-asp.net-core/ # obtention de l'adresse e-mail-de-facebook

4
Zain Rizvi