如何使用ASP.NET Core RC1中的Facebook提供程序获取其他字段?

时间:2016-04-16 20:57:53

标签: c# asp.net facebook oauth asp.net-core

我使用的是ASP.NET核心RC1(由于RC2缺乏VS支持,因此无法升级到尚未发布的RC2夜间版本。)

我试图从Facebook获取其他字段(first_namelast_nameemailsignificant_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_namelast_namesignificant_other(以及除了名称,ID和电子邮件之外我尝试过的任何其他字段)。

此外,是否可以获取FB访问令牌?我们可能需要它以便将来查询其他边缘,或者使用它来手动查询Facebook,因为ASP.NET Core有一个错误(至少在RC1中)。

我需要一种方法,即使不是最干净的方式。

2 个答案:

答案 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的相关链接: