Comment obtenir les valeurs Facebook prénom et nom de famille en utilisant ASP.NET MVC 5 et OWIN?

je sais qu'un champ' Nom ' est fourni, mais je préférerais accéder au prénom et au nom explicitement. Quelqu'un peut-il aider? Je suis encore en train d'enrouler ma tête ASP.Net MVC.

19
demandé sur David Poxon 2014-01-05 05:26:07

7 réponses

dans votre Startup.Auth.cs ConfigureAuth(IAppBuilder app) méthode, définir les paramètres suivants pour 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: "*");
         * */

puis utilisez ceci pour accéder aux informations de connexion de l'utilisateur:

var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();

Et puis le suivant pour obtenir le premier nom:

var firstNameClaim = loginInfo.ExternalIdentity.Claims.First(c => c.Type == "urn:facebook:first_name");
45
répondu David Poxon 2014-05-28 04:36:02

Facebook a modifié son api de permission. Vous pouvez obtenir plus d'informations à ce sujet ici: https://developers.facebook.com/docs/facebook-login/permissions

Nom de la nécessité public_profile autorisation

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

Et vous pouvez l'obtenir à l'aide de:

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

authenticationManager est une instance, vous pouvez obtenir en utilisant:

HttpContext.GetOwinContext().Authentication;
7
répondu Rafał Straszewski 2015-06-03 08:29:09

malheureusement, cette méthode ne fonctionne plus puisque Facebook a changé les valeurs de retour par défaut avec API update 2.4

cela ressemble à la seule façon d'obtenir le first_name etc. maintenant est d'utiliser L'API Facebook Graph (comme ceci postes suggère).

j'ai aussi trouvé ce post sur le site du projet Katana qui traite de cette question et a déjà soumis une demande de pull mais il n'a pas été fusionné jet.

espérons que ces coffres quelqu'un a un peu de temps ;)

6
répondu Anton 2017-05-23 12:17:57

à partir de 2017, c'est le code qui fonctionne pour moi(grâce au code de David Poxon ci-dessus). Assurez-vous que vous avez mis à jour vers la version 3.1.0 de Microsoft.Owin.Security.Facebook.

au Démarrage.Auth.cs (ou de Démarrage.cs dans certains cas), placez ce code:

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

puis, dans la méthode de rappel de connexion externe de votre controller, ajoutez ce code:

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

de même pour obtenir le nom de famille, utilisez la ligne ci-dessus et remplacez le urn:facebook:first_nameurn:facebook:last_name

2
répondu Waqas Shah 2017-07-25 06:19:11
 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");
    }

}
}
0
répondu sanket parikh 2016-06-07 12:56:05

Facebook a changé la façon dont leur API graphique renvoie la valeur dans la mise à niveau 2.4. Maintenant, vous devez spécifier explicitement tous les champs que vous voulez récupérer.

Voir cette note de: facebook pour les développeurs de Mise à niveau Info:

modifications de L'API Graph dans la version 2.4

dans le passé, les réponses des appels de L'API graphique retournaient un ensemble de champs par défaut. Afin réduire la taille de la charge utile et améliorer la latence sur mobile réseaux nous avons réduit le nombre de champs par défaut retournés pour la plupart des appels D'API graphiques. En v2.4 vous aurez besoin d'énumérer déclarativement la réponse champs pour vos appels.

pour obtenir L'Email, Le prénom et le nom de LastName de facebook:

tout d'Abord, vous devez installer SDK Facebook pour .NET nuget package

Puis, dans votre démarrage.Auth.cs, changer la configuration de L'authentification Facebook comme suit:

     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"]);

Enfin, dans votre AccountController, ajoutez le code suivant à ExternalLoginCallback method:

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

Voir Facebook API Guid pour plus de paramètres que vous pouvez récupérer.

0
répondu Hooman 2017-11-16 07:28:05

ajouter prénom et nom dans L'option Facebook Scope

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;
-3
répondu Khoa 2014-09-09 08:29:45