.net core 2.0 外部登录 - 额外的个人资料信息

Mas*_*rN8 1 twitter gmail facebook asp.net-identity asp.net-core-2.0

我有一个 .net core 2.0 应用程序,正在实施外部登录提供程序,如 google、twitter 和 facebook。我需要获取用户的显示名称和个人资料图片,但在 .net core 2.0 中找不到任何有关如何实现此目的的文档。

我像这篇文章一样添加身份验证:https : //docs.microsoft.com/en-us/aspnet/core/security/authentication/social/

这是我的推特登录和回调函数...

    [HttpGet]
    [Route("/api/security/login/type/socialmedia/twitter")]
    public IActionResult GetTwitterLogin(string redirect_uri)
    {
        ClientCallback = redirect_uri;
        string redirectUrl = "/api/security/login/type/socialmedia/twittercallback";
        var properties = SignInManager.ConfigureExternalAuthenticationProperties("Twitter", redirectUrl);
        return Challenge(properties, "Twitter");
    }

    [HttpGet]
    [Route("/api/security/login/type/socialmedia/twittercallback")]
    public async Task<HttpResponseMessage> GetTwitterCallBackAsync()
    {
        var info = await SignInManager.GetExternalLoginInfoAsync();

        var result = await SignInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false, bypassTwoFactor: true);
        if (result.Succeeded)
        {

        }
        else
        {

        }


        Response.StatusCode = (int)HttpStatusCode.OK;
        return null;
    }
Run Code Online (Sandbox Code Playgroud)

看起来您可以从 info.Principal.Claims 获取一些项目,但对于用户的显示名称或个人资料图片却没有。

您如何获得各种登录提供商的显示名称或个人资料图片?

Mas*_*rN8 5

我终于想通了……您需要在配置身份验证时添加声明。这些声明查看生成的 json 响应并从中提取项目。相关的行是 ClaimActions 项目。

 services.AddAuthentication()
               .AddTwitter(twitterOptions =>
               {
                   twitterOptions.ConsumerKey = cfg.SystemConfig["TwitterConsumerKey"];
                   twitterOptions.ConsumerSecret = cfg.SystemConfig["TwitterConsumerSecret"];
                   twitterOptions.SaveTokens = true;
                   twitterOptions.RetrieveUserDetails = true;
                   twitterOptions.ClaimActions.MapJsonKey("display-name", "name");
                   twitterOptions.ClaimActions.MapJsonKey("profile-image-url", "profile_image_url_https");
               })
               .AddFacebook(facebookOptions =>
               {
                   facebookOptions.AppId = cfg.SystemConfig["FacebookClientId"];
                   facebookOptions.AppSecret = cfg.SystemConfig["FacebookClientSecret"];
                   facebookOptions.SaveTokens = true;
                   facebookOptions.ClaimActions.MapJsonKey("display-name", "name");

               })
               .AddGoogle(googleOptions => 
               {
                   googleOptions.ClientId = cfg.SystemConfig["GoogleClientId"];
                   googleOptions.ClientSecret = cfg.SystemConfig["GoogleClientSecret"];
                   googleOptions.SaveTokens = true;
                   googleOptions.ClaimActions.MapJsonSubKey("profile-image-url", "image", "url");
                   googleOptions.ClaimActions.MapJsonKey("display-name", "displayName" );
               });
Run Code Online (Sandbox Code Playgroud)

在使用回调中获取登录信息后

var info = await SignInManager.GetExternalLoginInfoAsync();
Run Code Online (Sandbox Code Playgroud)

如果填充成功,您可以查询声明并找到值

 var profileImageClaim = info.Principal.Claims.Where(x => x.Type == "profile-image-url").FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

Facebook 图片不同于谷歌和推特,可以使用...

var claim = info.Principal.Claims.Where(x => x.Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier").FirstOrDefault();
var url = "http://graph.facebook.com/" + claim.Value + "/picture";
Run Code Online (Sandbox Code Playgroud)