使用 ASP.NET Web Api 从 Linkedin 请求额外的个人资料字段

Request additional profile fields from Linkedin with ASP.NET Web Api

我正在我的应用程序中使用 Linkedin 创建外部登录,到目前为止,我已经成功地使用相应的 Linkedin 帐户对用户进行了身份验证。为此,我使用了 NuGet 包 KatanaContrib.Security.LinkedInStartup.Auth.cs.

中的以下代码
app.UseLinkedInAuthentication(
   apiKey: ConfigurationManager.AppSettings["LinkedInAPIKey"].ToString(),
   secretKey: ConfigurationManager.AppSettings["LinkedInAPISecret"].ToString());

我成功地验证了用户并进行了外部注册。但是,我想获取 LinkedIn 提供的所有用户信息,以便将其保存到我的数据库中。在我看来,执行此操作的最佳位置是 AccountController 中的 RegisterExternal 方法,在该方法中创建新用户并将其添加到数据库中。但是,当我调试该方法时,我发现并非所有可用信息都从 LinkedIn 返回。

var info = await Authentication.GetExternalLoginInfoAsync();
var claims = info.ExternalIdentity.Claims;

只有 5 个声明返回,当我阅读 LinkedIn documentation page 时,我看到这些正是与基本配置文件数据对应的 5 个声明。显然,我用于 Linkedin 集成的外部库仅对基本个人资料数据发出请求,如果我想获得更多信息,我需要向另一个 url 发出请求。但是,在搜索了几个小时之后,我仍然找不到一种方法来覆盖 url 以检索我需要的数据字段。你知道我该如何解决这个问题吗?

经过长期的努力,我设法解决了我的问题。但是,我使用了 Owin.Security.Providers.LinkedIn 而不是 KatanaContrib.Security.LinkedIn 库,因为我找到了它的源代码,从那里我明白了该怎么做。这是解决方案:

        var linkedinOptions = new LinkedInAuthenticationOptions()
        {
            ClientId = ConfigurationManager.AppSettings["LinkedInAPIKey"].ToString(),
            ClientSecret = ConfigurationManager.AppSettings["LinkedInAPISecret"].ToString(),
            Provider = new LinkedInAuthenticationProvider()
            {
                OnAuthenticated = (context) =>
                {
                    foreach (var x in context.User)
                    {
                        var claimType = string.Format("urn:linkedin:{0}", x.Key);
                        string claimValue = x.Value.ToString();
                        if (!context.Identity.HasClaim(claim => claim.Value == claimValue))
                            context.Identity.AddClaim(new Claim(claimType, claimValue));
                    }

                    return Task.FromResult(0);
                }
            }
        };

        List<string> profileFieldsToGet = new List<string>() { "location" };

        foreach (var field in profileFieldsToGet)
        {
            linkedinOptions.ProfileFields.Add(field);
        }


        app.UseLinkedInAuthentication(linkedinOptions);

现在,在 profileFieldsToGet 中,您可以指定要获取的个人资料字段。可以找到所有基本配置文件字段 here.