2013-03-25 17 views
7

My MVC4アプリケーションはLinkedInアカウントを使用してログインできます。私は、ログインしたユーザーのlinkedInから利用可能なすべての詳細を取得したい。現在私は以下のことをしています。LinkedInで完全なプロフィール詳細MVC4でDotNetOpenAuthを使用

私は次のことを取得する必要が私のAuthConfig.csで

、linkedInCustomClient.csで

Dictionary<string, object> linkedInExtraData = new Dictionary<string, object>();   
     linkedInExtraData.Add("Icon", "../Images/linkedIn.png");   
     OAuthWebSecurity.RegisterClient(
      client: new App_Start.LinkedInCustomClient("xxxxxxxxxxxx", "yyyyyyyyyyyyyyy"), 
      displayName: "LinkedIn", 
      extraData: linkedInExtraData); 

、私のコントローラのLinkedIn開発キットから

public class LinkedInCustomClient : OAuthClient 
{ 
    private static XDocument LoadXDocumentFromStream(Stream stream) 
    { 
     var settings = new XmlReaderSettings 
     { 
      MaxCharactersInDocument = 65536L 
     }; 
     return XDocument.Load(XmlReader.Create(stream, settings)); 
    } 


    /// Describes the OAuth service provider endpoints for LinkedIn. 
    private static readonly ServiceProviderDescription LinkedInServiceDescription = 
      new ServiceProviderDescription 
      { 
       AccessTokenEndpoint = 
         new MessageReceivingEndpoint("https://api.linkedin.com/uas/oauth/accessToken", 
         HttpDeliveryMethods.PostRequest), 
       RequestTokenEndpoint = 
         new MessageReceivingEndpoint("https://api.linkedin.com/uas/oauth/requestToken?scope=r_fullprofile", 
         HttpDeliveryMethods.PostRequest), 
       UserAuthorizationEndpoint = 
         new MessageReceivingEndpoint("https://www.linkedin.com/uas/oauth/authorize", 
         HttpDeliveryMethods.PostRequest), 
       TamperProtectionElements = 
         new ITamperProtectionChannelBindingElement[] { new HmacSha1SigningBindingElement() }, 
       ProtocolVersion = ProtocolVersion.V10a 
      }; 

    public LinkedInCustomClient(string consumerKey, string consumerSecret) : 
     base("linkedIn", LinkedInServiceDescription, consumerKey, consumerSecret) { } 

    /// Check if authentication succeeded after user is redirected back from the service provider. 
    /// The response token returned from service provider authentication result. 
    [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", 
     Justification = "We don't care if the request fails.")] 
    protected override AuthenticationResult VerifyAuthenticationCore(AuthorizedTokenResponse response) 
    { 
     // See here for Field Selectors API http://developer.linkedin.com/docs/DOC-1014 
     const string profileRequestUrl = 
      "https://api.linkedin.com/v1/people/~:(id,first-name,last-name,interests,headline,industry,summary,email-address,location:(name),picture-url,positions,associations,languages,honors,educations,date-of-birth,primary-twitter-account,three-current-positions,three-past-positions,group-memberships,specialties,skills)"; 


     string accessToken = response.AccessToken; 
     string tokenSecret = (response as ITokenSecretContainingMessage).TokenSecret; 
     string Verifier = response.ExtraData.Values.First(); 


     var profileEndpoint = 
      new MessageReceivingEndpoint(profileRequestUrl, HttpDeliveryMethods.GetRequest); 
     HttpWebRequest request = 
      WebWorker.PrepareAuthorizedRequest(profileEndpoint, accessToken); 

     try 
     { 
      using (WebResponse profileResponse = request.GetResponse()) 
      { 
       using (Stream responseStream = profileResponse.GetResponseStream()) 
       { 
        XDocument document = LoadXDocumentFromStream(responseStream); 

        return new AuthenticationResult(
         isSuccessful: true, 
         provider: ProviderName, 
         providerUserId: userId, 
         userName: userName, 
         extraData: extraData); 
       } 
      } 
     } 
     catch (Exception exception) 
     { 
      return new AuthenticationResult(exception); 
     } 
    } 

} 

AuthenticationResult result = OAuthWebSecurity.VerifyAuthentication(Url.Action("ExternalLoginCallback", new { ReturnUrl = returnUrl })); 
     if (!result.IsSuccessful) 
     { 
      return RedirectToAction("ExternalLoginFailure"); 
     } 

認証結果としての私のコントローラの詳細。

(id,first-name,last-name,interests,headline,industry,summary,email-address,location:(name),picture-url,positions,associations,languages,honors,educations,date-of-birth,primary-twitter-account,three-current-positions,three-past-positions,group-memberships,specialties,skills) 
+0

この実装方法はありますか?私はインターネットを精査して、linkedInからデータをアプリケーションに引き出すための良い例は見つけられません。 – ledgeJumper

答えて

5

LinkedInからのリクエストの応答はxmlファイルになります。フォーマットとフィールドは、電子メールのフィールドを取得するためのLinkedIn Profile Fields

に記載されている、次のコード

XDocument document = LoadXDocumentFromStream(responseStream); 
に必要に応じてあなたがフィールドを取得することができます

RequestTokenEndpoint = new MessageReceivingEndpoint("https://api.linkedin.com/uas/oauth/requestToken?scope=r_fullprofile+r_emailaddress", HttpDeliveryMethods.PostRequest),

としてリクエストトークンURLを変更する必要があります

例:xmlファイルからファーストネームフィールドを取得する場合、

var firstName = document.Root.Element("first-name").Value; 

言語、位置、スキルなどのフィールドは、プロファイルの一部として構造化オブジェクトとして返されます。

例:言語フィールド。

var Lang = document.Root.Element("languages");       
    var languages = new List<string>(); 
    if (Lang != null) 
    { 
    foreach (var l in Lang.Elements()) 
     { 
      if (l.Element("language") != null && l.Element("language").Element("name") != null) 
      { 
      languages.Add(l.Element("language").Element("name").Value); 
      } 
     } 
     } 

次に、コントローラーでアクセスできる「extraData」にフィールドを追加できます。

extraData.Add("firstName", firstName); 
extraData.Add("languages", lang); 
関連する問題