2013-03-25 13 views
7

Meine MVC4-Anwendung ermöglicht die Anmeldung mit LinkedIn-Konto. Ich möchte alle Details von linkedIn des angemeldeten Benutzers abrufen. Zurzeit habe ich folgendes gemacht.LinkedIn Profildetails mit DotNetOpenAuth in MVC4

In My AuthConfig.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); 

In linkedInCustomClient.cs von LinkedIn Developer Kit

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); 
     } 
    } 

} 

In meinem Controller,

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

ich folgendes erhalten müssen Details in meinem Controller als Authentifizierungsergebnis.

(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

Haben Sie eine funktionierende Implementierung von diesem? Ich habe das Internet durchforstet und kann keine guten Beispiele finden, wie ich Daten von LinkedIn in meine Anwendung ziehen kann. – ledgeJumper

Antwort

5

Die Antwort Ihrer Anfrage von LinkedIn wird eine XML-Datei sein. Das Format und die Felder genannt werden in LinkedIn Profile Fields

Für E-Mail-Feld bekommen, müssen Sie Ihre Anfrage Token url als

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

ändern

Sie können die Felder erhalten, wie in den folgenden Code erforderlich

XDocument document = LoadXDocumentFromStream(responseStream); 

Beispiel: Zum Abrufen des Vornamenfeldes aus der XML-Datei

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

Felder wie Sprachen, Positionen, Fähigkeiten usw. werden als strukturierte Objekte als Teil des Profils zurückgegeben.

ZB: Sprachfeld.

Dann können Sie Felder zu "extraData" hinzufügen, die im Controller zugänglich sind

extraData.Add("firstName", firstName); 
extraData.Add("languages", lang); 
Verwandte Themen