Ottenere l’email da fornitori esterni Google e Facebook durante la fase di associazione dell’account in un’app MVC5 predefinita

Apparentemente puoi farlo con il provider di Facebook aggiungendo gli ambiti all’object FacebookAuthenticationOptions in 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 scope = new List() { "email" }; var x = new FacebookAuthenticationOptions(); x.Scope.Add("email"); ... app.UseFacebookAuthentication(x); 

Come fare lo stesso con il fornitore di Google? Non esiste una proprietà x.Scope per la class / object GoogleAuthenticationOptions !

SI PREGA DI VEDERE AGGIORNAMENTI IN BASSO DI QUESTO POST!

I seguenti lavori per me per Facebook :

StartupAuth.cs:

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

Metodo ExternalLoginCallback:

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

E per Google :

StartupAuth.cs

 app.UseGoogleAuthentication(); 

Metodo ExternalLoginCallback (come per Facebook):

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

Se ho impostato un punto di interruzione qui:

 var email = emailClaim.Value; 

Vedo l’indirizzo email sia per Facebook sia per Google nel debugger.

Aggiornamento 1 : La vecchia risposta mi ha confuso, quindi l’ho aggiornato con il codice che ho nel mio progetto che ho appena eseguito il debug e so che funziona.

Aggiornamento 2 : con la nuova versione di ASP.NET Identity 2.0 RTM non è più necessario alcun codice in questo post. Il modo corretto per ottenere l’e-mail è semplicemente facendo quanto segue:

  1. Startup.Auth.cs

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

     // // GET: /Account/ExternalLoginCallback [AllowAnonymous] public async Task 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 }); } } 

Devi configurare esplicitamente FacebookAuthenticationOptions per ottenere l’indirizzo email dall’utente autenticato.

Nel tuo progetto MVC5, aggiungi queste righe in Startup.Auth.cs

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

Aggiornamento Ridotto il mio codice di esempio al minimo assoluto. Il tuo codice aggiornato funziona bene, ho anche provato con Facebook e Google.

Nell’autenticazione Facebook ASP.NET Core il middleware di Facebook sembra non passare più nell’e-mail, anche se lo si aggiunge all’ambito. Puoi aggirare il problema usando il grafico Api di Facebook per richiedere l’e-mail.

Puoi utilizzare qualsiasi client Api grafico di Facebook o eseguire il rollover e utilizzarlo per richiamare l’api grafico come segue:

 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); } }; }); 

Puoi trovare un esempio più dettagliato su come usarlo qui: http://zainrizvi.io/2016/03/24/create-site-with-facebook-login-using-asp.net-core/#getting-the -email-indirizzo-da-facebook