asp.net-mvc-4 – LinkedIn在MVC4中使用DotNetOpenAuth的完整个人资料

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

例如:要从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);

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....