我正在我的应用程序中使用Linkedin创建外部登录,到目前为止,我已设法使用相应的Linkedin帐户对用户进行身份验证。出于此目的,我使用了NuGet包KatanaContrib.Security.LinkedIn
以及Startup.Auth.cs
中的以下代码。
app.UseLinkedInAuthentication(
apiKey: ConfigurationManager.AppSettings["LinkedInAPIKey"].ToString(),
secretKey: ConfigurationManager.AppSettings["LinkedInAPISecret"].ToString());
我成功地设法对用户进行身份验证并进行外部注册。但是,我想获取LinkedIn提供的所有用户信息,以便将其保存到我的数据库中。在我看来,执行此操作的最佳位置将在RegisterExternal
中AccountController
方法中创建新用户并添加到数据库中。但是,当我调试该方法时,我发现并非从LinkedIn返回所有可用信息。
var info = await Authentication.GetExternalLoginInfoAsync();
var claims = info.ExternalIdentity.Claims;
只返回了5个声明,当我阅读LinkedIn documentation page时,我看到这些正是5个声明对应基本个人资料数据。显然,我用于Linkedin集成的外部库只对基本配置文件数据发出请求,如果我想获取更多信息,我需要向另一个URL请求。但是,在搜索了几个小时后,我仍然找不到覆盖该URL的方法来重新检索我需要的数据字段。你知道我怎么能解决这个问题吗?
答案 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。