使用ASP.NET Web Api从Linkedin请求其他配置文件字段

时间:2017-02-11 19:59:28

标签: asp.net-web-api linkedin-api

我正在我的应用程序中使用Linkedin创建外部登录,到目前为止,我已设法使用相应的Linkedin帐户对用户进行身份验证。出于此目的,我使用了NuGet包KatanaContrib.Security.LinkedIn以及Startup.Auth.cs中的以下代码。

app.UseLinkedInAuthentication(
   apiKey: ConfigurationManager.AppSettings["LinkedInAPIKey"].ToString(),
   secretKey: ConfigurationManager.AppSettings["LinkedInAPISecret"].ToString());

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

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

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

1 个答案:

答案 0 :(得分:1)

经过长期的斗争,我设法解决了我的问题。但是,当我找到它的源代码时,我使用了库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