asp.net-mvc - hacer - security asp net mvc
Acceda a la dirección de correo electrónico en OAuth ExternalLoginCallback desde Facebook v2.4 API en ASP.NET MVC 5 (2)
Esta pregunta ya tiene una respuesta aquí:
Con la versión 2.3 de la API de Facebook, siempre que se establezca lo siguiente, la dirección de correo electrónico de los usuarios se devolverá en la devolución de llamada a
ExternalLoginCallback
;
app.UseFacebookAuthentication(new FacebookAuthenticationOptions
{
AppId = "XXX",
AppSecret = "XXX",
Scope = { "email" }
});
Sin embargo, cualquier aplicación que solo pueda apuntar a la v2.4 (lanzada el 8 de julio) ya no devuelve la dirección de correo electrónico a
ExternalLoginCallback
.
Creo que esto puede estar relacionado con los cambios de v2.4 como se enumeran here ;
Campos declarativos
Para intentar mejorar el rendimiento en redes móviles, los nodos y bordes en v2.4 requieren que solicite explícitamente los campos que necesita para sus solicitudes GET. Por ejemplo,
GET /v2.4/me/feed
ya no incluye me gusta y comentarios de forma predeterminada, peroGET /v2.4/me/feed?fields=comments,likes
devolverá los datos. Para obtener más detalles, consulte los documentos sobre cómo solicitar campos específicos.
¿Cómo puedo acceder a esta dirección de correo electrónico ahora?
En MVC 6 (Asp.net Core 1.0), configurando FacebookAuthentication en startup.cs de esta manera:
app.UseFacebookAuthentication(options =>
{
options.AppId = Configuration["Authentication:Facebook:AppId"];
options.AppSecret = Configuration["Authentication:Facebook:AppSecret"];
options.Scope.Add("email");
options.UserInformationEndpoint = "https://graph.facebook.com/v2.4/me?fields=id,name,email,first_name,last_name";
});
Podría recibir el correo electrónico. Es decir:
var info = await _signInManager.GetExternalLoginInfoAsync();
var email = info.ExternalPrincipal.FindFirstValue(ClaimTypes.Email);
Para resolver esto, tuve que instalar el SDK de Facebook para .NET desde nuget y consultar la dirección de correo electrónico por separado.
En el método
ExternalLoginCallback
, agregué un condicional para completar la dirección de correo electrónico desde la API de Facebook Graph;
var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
if (loginInfo == null)
{
return RedirectToAction("Login");
}
// added the following lines
if (loginInfo.Login.LoginProvider == "Facebook")
{
var identity = AuthenticationManager.GetExternalIdentity(DefaultAuthenticationTypes.ExternalCookie);
var access_token = identity.FindFirstValue("FacebookAccessToken");
var fb = new FacebookClient(access_token);
dynamic myInfo = fb.Get("/me?fields=email"); // specify the email field
loginInfo.Email = myInfo.email;
}
Y para obtener el
FacebookAccessToken
extendí
ConfigureAuth
;
app.UseFacebookAuthentication(new FacebookAuthenticationOptions
{
AppId = "XXX",
AppSecret = "XXX",
Scope = { "email" },
Provider = new FacebookAuthenticationProvider
{
OnAuthenticated = context =>
{
context.Identity.AddClaim(new System.Security.Claims.Claim("FacebookAccessToken", context.AccessToken));
return Task.FromResult(true);
}
}
});