net mvc example crear asp asp.net-mvc facebook asp.net-mvc-5 owin

example - ¿Cómo obtener los valores de nombre y apellido de Facebook utilizando ASP.NET MVC 5 y OWIN?



security asp net mvc (7)

Sé que se proporciona un campo ''Nombre'', pero preferiría acceder explícitamente a los nombres y apellidos. ¿Alguien puede ayudar con esto? Todavía estoy envolviendo mi cabeza alrededor de ASP.Net MVC.


A partir de 2017, este es el código que está funcionando para mí (Gracias al código de David Poxon más arriba). Asegúrese de haber actualizado a la versión 3.1.0 de Microsoft.Owin.Security.Facebook .

En el Startup.Auth.cs (o Startup.cs en algunos casos), coloque este código:

app.UseFacebookAuthentication(new FacebookAuthenticationOptions() { AppId = "***", AppSecret = "****", BackchannelHttpHandler = new HttpClientHandler(), UserInformationEndpoint = "https://graph.facebook.com/v2.8/me?fields=id,name,email,first_name,last_name", Scope = { "email" }, Provider = new FacebookAuthenticationProvider() { OnAuthenticated = async context => { context.Identity.AddClaim(new System.Security.Claims.Claim("FacebookAccessToken", context.AccessToken)); foreach (var claim in context.User) { var claimType = string.Format("urn:facebook:{0}", claim.Key); string claimValue = claim.Value.ToString(); if (!context.Identity.HasClaim(claimType, claimValue)) context.Identity.AddClaim(new System.Security.Claims.Claim(claimType, claimValue, "XmlSchemaString", "Facebook")); } } } });

Luego, en el método de devolución de llamada de inicio de sesión externo de su controlador, agregue este código:

var firstName = loginInfo.ExternalIdentity.Claims.First(c => c.Type == "urn:facebook:first_name").Value;

Del mismo modo, para obtener el apellido, use la línea anterior y reemplace la urn:facebook:first_name con urn:facebook:last_name


Añadir nombre y apellido en la opción de facebook Ámbito

var facebookOptions = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationOptions() { AppId = "your app id", AppSecret = "your app secret", }; facebookOptions.Scope.Add("email"); facebookOptions.Scope.Add("first_name"); facebookOptions.Scope.Add("last_name"); return facebookOptions;


Desafortunadamente, este método ya no funciona, ya que Facebook cambió sus valores de retorno predeterminados con la actualización de API 2.4

Parece que la única forma de obtener el primer nombre, etc. ahora es usar la API de gráficos de Facebook ( como sugiere este post ).

También encontré esta publicación en el sitio del proyecto Katana que aborda este problema y ya presenté una solicitud de extracción pero no se ha fusionado.

Esperemos que esto le asegure a alguien un poco de tiempo;)


Facebook cambió su permiso api. Puede obtener más información al respecto aquí: https://developers.facebook.com/docs/facebook-login/permissions

Nombre necesita permiso de perfil público

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

Y puedes conseguirlo usando:

var loginInfo = await authenticationManager.GetExternalLoginInfoAsync(); loginInfo.ExternalIdentity.Claims.First(c => c.Type == "urn:facebook:name")

authenticationManager es una instancia, puede utilizar:

HttpContext.GetOwinContext().Authentication;


Facebook ha cambiado la forma en que su Graph Graph devuelve valor en la actualización 2.4 . Ahora necesita especificar explícitamente todos los campos que desea recuperar.

Ver esta nota de: facebook para desarrolladores Información de actualización :

Graph API cambios en la versión 2.4

En el pasado, las respuestas de las llamadas Graph API devolvían un conjunto de campos predeterminados. Con el fin de reducir el tamaño de la carga útil y mejorar la latencia en las redes móviles, hemos reducido el número de campos predeterminados devueltos para la mayoría de las llamadas API de Graph. En v2.4 deberá enumerar de manera declarativa los campos de respuesta para sus llamadas.

Para obtener correo electrónico, nombre y apellido de facebook:

Primero, necesita instalar el SDK de Facebook para el paquete nuget de .NET

Luego, en su inicio.Auth.cs, cambie la configuración de la autenticación de Facebook de la siguiente manera:

app.UseFacebookAuthentication(new FacebookAuthenticationOptions { // put your AppId and AppSecret here. I am reading them from AppSettings AppId = ConfigurationManager.AppSettings["FacebookAppId"], AppSecret = ConfigurationManager.AppSettings["FacebookAppSecret"], Scope = { "email" }, Provider = new FacebookAuthenticationProvider { OnAuthenticated = context => { context.Identity.AddClaim(new System.Security.Claims.Claim("FacebookAccessToken", context.AccessToken)); return Task.FromResult(true); } } }); // this is no longer needed //app.UseFacebookAuthentication( // appId: ConfigurationManager.AppSettings["FacebookAppId"], // appSecret: ConfigurationManager.AppSettings["FacebookAppSecret"]);

Finalmente, en su AccountController, agregue el siguiente código al método ExternalLoginCallback:

if (string.Equals(loginInfo.Login.LoginProvider, "facebook", StringComparison.CurrentCultureIgnoreCase)) { var identity = AuthenticationManager.GetExternalIdentity(DefaultAuthenticationTypes.ExternalCookie); var access_token = identity.FindFirstValue("FacebookAccessToken"); var fb = new FacebookClient(access_token); // you need to specify all the fields that you want to get back dynamic myInfo = fb.Get("/me?fields=email,first_name,last_name"); string email = myInfo.email; string firstName = myInfo.first_name; string lastName = myInfo.last_name; }

Ver facebook API Guid para más parámetros que puede recuperar.


En su método Startup.Auth.cs ConfigureAuth(IAppBuilder app) , configure lo siguiente para Facebook:

var x = new FacebookAuthenticationOptions(); x.Scope.Add("email"); x.AppId = "*"; x.AppSecret = "**"; x.Provider = new FacebookAuthenticationProvider() { OnAuthenticated = async context => { context.Identity.AddClaim(new System.Security.Claims.Claim("FacebookAccessToken", context.AccessToken)); foreach (var claim in context.User) { var claimType = string.Format("urn:facebook:{0}", claim.Key); string claimValue = claim.Value.ToString(); if (!context.Identity.HasClaim(claimType, claimValue)) context.Identity.AddClaim(new System.Security.Claims.Claim(claimType, claimValue, "XmlSchemaString", "Facebook")); } } }; x.SignInAsAuthenticationType = DefaultAuthenticationTypes.ExternalCookie; app.UseFacebookAuthentication(x); /* app.UseFacebookAuthentication( appId: "*", appSecret: "*"); * */

Luego use esto para acceder a la información de inicio de sesión del usuario:

var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();

Y luego lo siguiente para obtener el primer nombre:

var firstNameClaim = loginInfo.ExternalIdentity.Claims.First(c => c.Type == "urn:facebook:first_name");


private Uri RedirectUri { get { var uriBuilder = new UriBuilder(Request.Url); uriBuilder.Query = null; uriBuilder.Fragment = null; uriBuilder.Path = Url.Action("FacebookCallback"); return uriBuilder.Uri; } } [AllowAnonymous] public ActionResult Facebook() { var fb = new FacebookClient(); var loginUrl = fb.GetLoginUrl(new { client_id = "296002327404***", client_secret = "4614cd636ed2029436f75c77961a8***", redirect_uri = RedirectUri.AbsoluteUri, response_type = "code", scope = "email" // Add other permissions as needed }); return Redirect(loginUrl.AbsoluteUri); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult LogOff() { FormsAuthentication.SignOut(); return View("Login"); } public ActionResult FacebookCallback(string code) { var fb = new FacebookClient(); dynamic result = fb.Post("oauth/access_token", new { client_id = "296002327404***", client_secret = "4614cd636ed2029436f75c77961a8***", redirect_uri = RedirectUri.AbsoluteUri, code = code }); var accessToken = result.access_token; // Store the access token in the session for farther use Session["AccessToken"] = accessToken; // update the facebook client with the access token so // we can make requests on behalf of the user fb.AccessToken = accessToken; // Get the user''s information dynamic me = fb.Get("me?fields=first_name,middle_name,last_name,id,email"); string email = me.email; string firstname = me.first_name; string middlename = me.middle_name; string lastname = me.last_name; db.Insert_customer(firstname,email,null,null,null,null,null,null,null,null,null,null,1,1,System.DateTime.Now,1,System.DateTime.Now); // Set the auth cookie FormsAuthentication.SetAuthCookie(email, false); return RedirectToAction("Index", "Home"); } } }