我使用的是ASP.NET核心RC1(由于RC2缺乏VS支持,因此无法升级到尚未发布的RC2夜间版本。)
我试图从Facebook获取其他字段(first_name
,last_name
,email
和significant_other
)。
我使用了Github上建议的代码:
app.UseFacebookAuthentication(options =>
{
options.AppId = Configuration["Authentication:Facebook:AppId"];
options.AppSecret = Configuration["Authentication:Facebook:AppSecret"];
options.Scope.Add("email");
options.Scope.Add("user_relationships");
options.BackchannelHttpHandler = new HttpClientHandler();
options.UserInformationEndpoint =
"https://graph.facebook.com/v2.5/me?fields=id,email,first_name,last_name,significant_other";
此解决方案确实会返回用户的email
,但却失败了first_name
,last_name
和significant_other
(以及除了名称,ID和电子邮件之外我尝试过的任何其他字段)。
此外,是否可以获取FB访问令牌?我们可能需要它以便将来查询其他边缘,或者使用它来手动查询Facebook,因为ASP.NET Core有一个错误(至少在RC1中)。
我需要一种方法,即使不是最干净的方式。
答案 0 :(得分:8)
我试图从Facebook获取其他字段(first_name,last_name,email和significant_other)。这个解决方案确实返回了用户的电子邮件,但是使用first_name,last_name和significant_other(以及除了名称,id和电子邮件之外我尝试过的任何其他字段)都失败了。
在RC1中,Facebook中间件自动将电子邮件存储为声明,但不是名字或姓氏,因此如果您希望能够从应用程序代码中检索,则需要使用事件模型手动提取它们:
app.UseFacebookAuthentication(options => {
options.Events = new OAuthEvents {
OnCreatingTicket = context => {
var surname = context.User.Value<string>("last_name");
context.Identity.AddClaim(new Claim(ClaimTypes.Surname, surname));
return Task.FromResult(0);
}
};
});
在RC2中,自定义代码不再有必要,因为默认情况下现在包含名字/姓氏:https://github.com/aspnet/Security/issues/688。
此外,是否可以获取FB访问令牌?我们可能需要它以便将来查询其他边缘,或者使用它来手动查询Facebook,因为ASP.NET Core有一个错误(至少在RC1中)。
您可以使用SaveTokensAsClaims
选项将访问/刷新令牌存储为声明(默认情况下在RC1中启用)。如果您需要有关此功能的更多信息,可以查看介绍它的PR:https://github.com/aspnet/Security/pull/257。
app.UseFacebookAuthentication(options => {
options.SaveTokensAsClaims = true;
});
您可以像任何其他声明一样检索它:
var token = User.FindFirst("access_token")?.Value
注意:在RC2中,此功能已经过修改,令牌不会存储在声明中,而是存储在身份验证属性中:https://github.com/aspnet/Security/pull/698。
答案 1 :(得分:1)
更新到@Pinpoint答案:当前版本不再有SaveTokensAsClaims
选项。相反,现在有一个SaveTokens
option:
定义访问和刷新令牌是否应存储在 成功授权后
Http.Authentication.AuthenticationProperties
。默认情况下,此属性设置为false
,以减小最终身份验证cookie的大小。
请注意,默认情况下,它是假的,不会存储在声明中。已添加AuthenticationTokenExtensions
课程
要获取这些令牌,您可以使用AuthenticationTokenExtensions类中定义的GetToken
扩展方法之一。例如,在控制器操作方法中,以下代码应该起作用:
var token = await HttpContext.Authentication.GetTokenAsync("access_token");
github的相关链接: