2017-02-11 82 views
0

我在我的应用程序中创建了与Linkedin的外部登录,至今我已设法使用其相应的Linkedin帐户对用户进行身份验证。为此,我使用了NuGet软件包KatanaContrib.Security.LinkedInStartup.Auth.cs中的以下代码。从ASP.NET使用ASP.NET Web Api请求额外的配置文件字段

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个索赔correspoding基本配置文件数据。很明显,我用于Linkedin集成的外部库只提供基本配置文件数据的请求,如果我想获得更多信息,我需要向另一个url发送请求。但是,搜索了几个小时后,我仍然无法找到覆盖该网址的方法,以便检索我需要的数据字段。你有什么想法我怎么能解决这个问题?

回答

0

经过漫长的斗争,我设法解决了我的问题。但是,我使用库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