2017-02-11 31 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