tutorial net mvc example crear autenticacion asp asp.net-mvc-5 asp.net-identity asp.net-identity-2

asp.net mvc 5 - net - Obtención del correo electrónico de proveedores externos Google y Facebook durante el paso de asociación de cuenta en una aplicación MVC5 predeterminada



login c# sql server mvc (3)

Aparentemente, puedes 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<string> scope = new List<string>() { "email" }; var x = new FacebookAuthenticationOptions(); x.Scope.Add("email"); ... app.UseFacebookAuthentication(x);

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


Debe configurar explícitamente las Opciones de autenticación de Facebook 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);

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


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

Puede usar cualquier cliente de Facebook Graph Api o enrollar el suyo 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-email-address-from-facebook


¡POR FAVOR VEA LAS ACTUALIZACIONES EN LA PARTE INFERIOR DE ESTE POST!

Los siguientes trabajos para mí 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 de 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 establezco un punto de interrupción aquí:

var email = emailClaim.Value;

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

Actualización 1 : La respuesta anterior me había confundido, así que lo 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 ninguno de los códigos 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<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 }); } }