How to get Facebook first and last name values using ASP.NET MVC 5 and OWIN?

Facebook changed its permission api. You can get more information about it here: https://developers.facebook.com/docs/facebook-login/permissions

Name need public_profile permission

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

And you can get it using:

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

authenticationManager is an instance, you can get using:

HttpContext.GetOwinContext().Authentication;

In your Startup.Auth.cs ConfigureAuth(IAppBuilder app) method, set the following for 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: "*");
         * */

Then use this to access the user's login info:

var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();

And then the following to get the first name:

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

Unfortunately this method doesn't work anymore since Facebook changed their default return values with API update 2.4

It looks like the only way to get the first_name etc. now is to use the Facebook Graph API (like this posts suggests).

I also found this post on the Katana project site that addresses this issue and already submitted a pull request but it has not been merged jet.

Hopefully this safes somebody a little bit of time ;)