我的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);