如何在asp.net核心MVC RC2中检索facebook用户个人资料图片

时间:2016-06-19 05:36:52

标签: asp.net-core asp.net-core-mvc facebook-authentication

使用ASP.NET Core MVC RC2我正在尝试检索Facebook用户个人资料图片。为此,我在Startup类的Configure方法中有以下几行

            app.UseFacebookAuthentication(new FacebookOptions()
        {
            AppId = Configuration["Authentication:Facebook:AppId"],
            AppSecret = Configuration["Authentication:Facebook:AppSecret"],
            Scope = { "user_birthday" },
            Fields = { "birthday", "picture" },
        });

在AccountControllers ExternalLoginCallback方法中,我期望看到ClaimsPrincipal集合中的图片数据,可以通过info.Principal访问,但我看不到任何与图片相关的声明。

这是检索Facebook用户个人资料图片的正确方法,还是我错过了什么?

3 个答案:

答案 0 :(得分:2)

使用第三方认证,您只能获得有关用户的信息(用户认证)。

使用Facebook身份验证,成功登录后,您将收到一个访问Facebook API的权限和一组用户数据(声明)仅来自 UserInformationEndpointhttps://graph.facebook.com/v2.6/me)。< / p>

之后,如果您想获取任何其他用户特定信息(例如您的案例中的用户图片,Facebook Graph API. User Picture),则应调用Facebook API方法。

如果您对填写Facebook登录的ASP.Core实现的说法感兴趣,请查看FacebookHandler类中的CreateTicketAsync方法 - 此处创建了声明集合。

答案 1 :(得分:2)

对于使用Microsoft'OWin Facebook身份验证扩展程序的任何人。您可以扩展默认FacebookAuthenticationProvider以获取当前标识的任何请求(和授予)声明。然后在中间件中注册该客户提供商。一个简单的自定义提供程序看起来像这样......

public class CustomFacebookOAuthProvider: FacebookAuthenticationProvider
    {
        public override Task Authenticated(FacebookAuthenticatedContext context)
        {
            if (context.User.IsNotNull() && context.Id.IsNotNullOrEmpty())
            {
                //ADD THE CLAIMS YOU WANT YOUR APP TO CONSUME
                context.Identity.AddClaim(new Claim(Constants.ClaimsTypes.PhotoUrl
                    , "https://graph.facebook.com/{0}/picture?height={1}&width={1}".With(context.Id, Constants.UI.DEFAUL_PROFILE_PICTURE_DIMENS)));
            }

            return base.Authenticated(context);
        }
    }

实现很简单,我们只需覆盖Authenticated方法,一旦OAuth提供程序(本例中的Facebook)对用户进行了身份验证并返回用户详细信息(将其转换为调用),将调用该方法到UserInfo端点)。

context.UserNewtonSoft.Json.JObject,可以将其解析为您自己的班级......

var user = context.User.ToObject<FacebookOAuthUser>();

请确保使用所需的属性创建FacebookOAuthUser类。

一旦你有了这个提供者,你只需要注册它......

app.UseFacebookAuthentication(new FacebookAuthenticationOptions
{
    AuthenticationType = "Facebook",
    Caption = "Sign-in with Facebook",
    SignInAsAuthenticationType = signInAsType,
    AppId = ApplicationSettings.FacebookAppID,
    AppSecret = ApplicationSettings.FacebookAppSecret,
    Provider = new CustomFacebookOAuthProvider()
});

答案 2 :(得分:0)

要从Facebook获取个人资料图片,您需要配置Facebook选项并从OAuth订阅OnCreatingTicket事件。

services.AddAuthentication().AddFacebook("Facebook", options =>
                {

                    options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
                    options.ClientId = "ClientId";
                    options.ClientSecret = "ClientSecret";
                    options.Fields.Add("picture"); // <- Add field picture
                    options.Events = new OAuthEvents
                    {
                        OnCreatingTicket = context =>
                        {
                            var identity = (ClaimsIdentity)context.Principal.Identity;
                            var profileImg = context.User["picture"]["data"].Value<string>("url");
                            identity.AddClaim(new Claim(JwtClaimTypes.Picture, profileImg));
                            return Task.CompletedTask;
                        }
                    };
                });