如何在 asp.net 核心 MVC RC2 中检索 facebook 用户个人资料图片
How to retrieve facebook user profile picture within asp.net core MVC RC2
使用 ASP.NET Core MVC RC2 我正在尝试检索 Facebook 用户个人资料图片。为此,我在 Startup class
的 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 方身份验证,您只能获得有关用户身份的信息(用户身份验证)。
使用 Facebook 身份验证,成功登录后您会收到 Facebook 的访问令牌 API 和一组用户数据(声明)仅来自 UserInformationEndpoint (https://graph.facebook.com/v2.6/me ).
之后,如果您想获取任何其他用户特定信息(例如您的用户图片 - Facebook Graph API. User Picture),您应该调用 Facebook API 方法。
如果您对 Facebook 登录的 ASP.Core 实现已填充的声明感兴趣,请查看 FacebookHandler class 中的 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
可以反序列化为您自己的 class...
var user = context.User.ToObject<FacebookOAuthUser>();
只需确保创建具有所需属性的 FacebookOAuthUser
class。
一旦您拥有该提供商,您只需注册它...
app.UseFacebookAuthentication(new FacebookAuthenticationOptions
{
AuthenticationType = "Facebook",
Caption = "Sign-in with Facebook",
SignInAsAuthenticationType = signInAsType,
AppId = ApplicationSettings.FacebookAppID,
AppSecret = ApplicationSettings.FacebookAppSecret,
Provider = new CustomFacebookOAuthProvider()
});
要从 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;
}
};
});
使用 ASP.NET Core MVC RC2 我正在尝试检索 Facebook 用户个人资料图片。为此,我在 Startup class
的 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 方身份验证,您只能获得有关用户身份的信息(用户身份验证)。
使用 Facebook 身份验证,成功登录后您会收到 Facebook 的访问令牌 API 和一组用户数据(声明)仅来自 UserInformationEndpoint (https://graph.facebook.com/v2.6/me ).
之后,如果您想获取任何其他用户特定信息(例如您的用户图片 - Facebook Graph API. User Picture),您应该调用 Facebook API 方法。
如果您对 Facebook 登录的 ASP.Core 实现已填充的声明感兴趣,请查看 FacebookHandler class 中的 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
可以反序列化为您自己的 class...
var user = context.User.ToObject<FacebookOAuthUser>();
只需确保创建具有所需属性的 FacebookOAuthUser
class。
一旦您拥有该提供商,您只需注册它...
app.UseFacebookAuthentication(new FacebookAuthenticationOptions
{
AuthenticationType = "Facebook",
Caption = "Sign-in with Facebook",
SignInAsAuthenticationType = signInAsType,
AppId = ApplicationSettings.FacebookAppID,
AppSecret = ApplicationSettings.FacebookAppSecret,
Provider = new CustomFacebookOAuthProvider()
});
要从 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;
}
};
});