Obtener el correo electrónico de los proveedores externos Google y Facebook durante el paso de asociación de cuentas en una aplicación MVC5 predeterminada

Aparentemente puede hacer esto con el proveedor de Facebook agregando ámbitos al objeto FacebookAuthenticationOptions en 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); 

¿Cómo hacer lo mismo con el proveedor de Google? ¡No existe una propiedad x.Scope para la clase / objeto GoogleAuthenticationOptions !

¡POR FAVOR, VER ACTUALIZACIONES EN LA PARTE INFERIOR DE ESTE POST!

Lo siguiente me funciona para Facebook :

StartupAuth.cs:

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

Método ExternalLoginCallback:

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

Y para Google :

StartupAuth.cs

 app.UseGoogleAuthentication(); 

Método ExternalLoginCallback (igual que para 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 configuro un punto de interrupción aquí:

 var email = emailClaim.Value; 

Veo la dirección de correo electrónico para Facebook y Google en el depurador.

Actualización 1 : La respuesta anterior me confundió, así que la actualicé con el código que tengo en mi propio proyecto que acabo de depurar y sé que funciona.

Actualización 2 : con la nueva versión ASP.NET Identity 2.0 RTM ya no necesita el código en esta publicación. La forma correcta de recibir el correo electrónico es simplemente haciendo lo siguiente:

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

Necesita configurar explícitamente FacebookAuthenticationOptions para obtener la dirección de correo electrónico del usuario autenticado.

En su proyecto MVC5, agregue estas líneas en el Startup.Auth.cs

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

Actualización Redujo mi código de muestra al mínimo absoluto. Su código actualizado funciona bien por cierto, también lo he intentado con Facebook y Google.

En la autenticación ASP.NET Core Facebook, parece que el middleware de Facebook ya no pasa en el correo electrónico, incluso si lo agrega al scope. Puede solucionarlo utilizando Graph Api de Facebook para solicitar el correo electrónico.

Puede usar cualquier cliente API Api de Facebook o hacer su propio y usarlo para invocar la API de Graph de la siguiente manera:

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

Puede encontrar un ejemplo más detallado sobre cómo usarlo aquí: http://zainrizvi.io/2016/03/24/create-site-with-facebook-login-using-asp.net-core/#getting-the -correo-de-correo-de-facebook