使用 ASP.NET Web Api 从 Linkedin 请求额外的个人资料字段
Request additional profile fields from Linkedin with ASP.NET Web Api
我正在我的应用程序中使用 Linkedin 创建外部登录,到目前为止,我已经成功地使用相应的 Linkedin 帐户对用户进行了身份验证。为此,我使用了 NuGet 包 KatanaContrib.Security.LinkedIn
和 Startup.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.
我正在我的应用程序中使用 Linkedin 创建外部登录,到目前为止,我已经成功地使用相应的 Linkedin 帐户对用户进行了身份验证。为此,我使用了 NuGet 包 KatanaContrib.Security.LinkedIn
和 Startup.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.