我的MVC4应用程序允许使用LinkedIn帐户登录.我想从登录用户的linkedIn中提取所有可用的详细信息.目前我做了以下工作.
在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);
在LinkedIn Developer Kit中的linkedInCustomClient.cs中
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",UserAuthorizationEndpoint = new MessageReceivingEndpoint("https://www.linkedin.com/uas/oauth/authorize",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,skills)
解决方法
来自LinkedIn的请求的响应将是一个xml文件.格式和字段在
LinkedIn Profile Fields中提到
RequestTokenEndpoint = new MessageReceivingEndpoint(“https://api.linkedin.com/uas/oauth/requestToken?scope=r_fullprofile r_emailaddress”,
HttpDeliveryMethods.PostRequest)
XDocument document = LoadXDocumentFromStream(responseStream);
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);