Asp.net core 如何在asp.net核心MVC RC2中检索facebook用户配置文件图片

Asp.net core 如何在asp.net核心MVC RC2中检索facebook用户配置文件图片,asp.net-core,asp.net-core-mvc,facebook-authentication,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 = Configu

使用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用户档案图片的正确方法,还是我遗漏了什么?

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

使用Facebook身份验证,成功登录后,您将收到Facebook API的访问令牌和一组用户数据(声明),仅来自()

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


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

适用于任何使用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.User
是一个
NewtonSoft.Json.JObject
,它可以被分解为您自己的类

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

要从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;
                        }
                    };
                });
services.AddAuthentication().AddFacebook(“Facebook”,选项=>
{
options.signnscheme=IdentityServerConstants.ExternalCookieAuthenticationScheme;
options.ClientId=“ClientId”;
options.ClientSecret=“ClientSecret”;
选项。字段。添加(“图片”);//
{
var identity=(ClaimsIdentity)context.Principal.identity;
var profileImg=context.User[“picture”][“data”].Value(“url”);
identity.AddClaim(新索赔(JwtClaimTypes.Picture,profileImg));
返回Task.CompletedTask;
}
};
});

感谢Set澄清claims principal集合只包含UserInformationEndpoint的数据。您能给我举个例子说明如何调用facebook api方法吗?请勾选这个毫无帮助的答案。。。没有解释任何关于Facebook认证中间件的事情。。。
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;
                        }
                    };
                });