ASP.NET Core Facebook认证中间件用户图片

5
我尝试在ASP.NET Core 1.0中使用Facebook身份验证中间件来获取用户个人资料图片。我已经成功添加了以下配置,使用户头像可用:
app.UseFacebookAuthentication(new FacebookOptions()
        {
            AppId = Configuration["Authentication:Facebook:AppId"],
            AppSecret = Configuration["Authentication:Facebook:AppSecret"],
            Scope = { "public_profile" },
            Fields = { "picture" }
        });

并且检索数据

var email = info.Principal.FindFirstValue(ClaimTypes.Email);

并且

var userName = info.Principal.FindFirstValue(ClaimTypes.GivenName);

但是我现在怎么能够检索用户的图片呢?因为它没有相关的Claim Type


在这种情况下,你是如何定义 info 的? - b_g
3个回答

6
如Set在他的答案中所说,您可以使用Facebook Graph API 获取图片,代码如下:https://graph.facebook.com/{user-id}/picture
示例代码:
var info = await _signInManager.GetExternalLoginInfoAsync();
var identifier = info.Principal.FindFirstValue(ClaimTypes.NameIdentifier); 
var picture = $"https://graph.facebook.com/{identifier}/picture";

您可能需要检查info是否为非空值,以及info.LoginProvider是否为Facebook。


那么NameIdentifier就是用户ID吗? - Ahmad
@Ahmad 是的,你可以在这里查看源代码(https://github.com/aspnet/Security/blob/release/src/Microsoft.AspNetCore.Authentication.Facebook/FacebookHandler.cs#L48)。 - tmg
tmg提供的代码并不返回Facebook用户ID,而是返回在Web应用程序中使用的用户ID。我该如何获取Facebook用户ID? - b_g

2
通常情况下,UserInfo端点的标准实现(oauth)如果您指定Fields = { "picture" },则可能在响应中返回图片。
Facebook Graph API提供https://graph.facebook.com/v2.6/me作为用户信息端点,ASP.NET Core Facebook Auth中间件用它来填充声明。
问题是,如果您使用此\me端点,则Facebook Graph API不会在响应中返回picture。他们以前这样做过,但由于某种原因已经删除了。相关SO:facebook oauth, no picture with basic permissions 但是,您可以通过以下方式获取图片: https://graph.facebook.com/USERNAME/picture

那我需要用JavaScript来完成吗?获取用户名/用户ID,然后检索它? - Ahmad
你能给我指一些关于这个中间件的例子或文档吗? - Ahmad
@Ahmad,你可以在客户端或服务器端进行此调用 - 只需使用访问令牌即可请求。我担心现在关于中间件的最佳信息只有在 GitHub 上的源代码 https://github.com/aspnet/Security/tree/master/src/Microsoft.AspNetCore.Authentication.Facebook - Set
能否请您包括一个如何在服务器端执行此操作的示例?也许是通过扩展这个中间件或其他什么方式。 - Ahmad
由于我是ASP.NET Core的新手,我无法理解如何使用其他类似的SO问题给出的答案来完成它。 - Ahmad

1
在我的 ASP.NET Core 2.2 项目中,我使用了以下代码:

services.AddAuthentication()
    .AddFacebook(options =>
    {
        options.AppId = Configuration["Authentication:Facebook:AppId"];
        options.AppSecret = Configuration["Authentication:Facebook:AppSecret"];
        options.Events.OnCreatingTicket = (context) =>
        {
            var picture = $"https://graph.facebook.com/{context.Principal.FindFirstValue(ClaimTypes.NameIdentifier)}/picture?type=large";
            context.Identity.AddClaim(new Claim("Picture", picture));
            return Task.CompletedTask;
        };
    });

在控制器中,在ExternalLoginCallback操作中,我以如下方式检索值:
var info = await _signInManager.GetExternalLoginInfoAsync();
var picture = info.Principal.FindFirstValue("Picture");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接