在 MVC4 中使用 DotNetOpenAuth 的 LinkedIn 完整个人资料详细信息

2024-02-20

我的 MVC4 应用程序允许使用 LinkedIn 帐户登录。我想提取登录用户的 linkedIn 中可用的所有详细信息。目前我做了以下工作。

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

在 linkedInCustomClient.cs 中,来自 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)

LinkedIn 对您的请求的响应将是一个 xml 文件。格式和字段在中提到LinkedIn 个人资料字段 https://developer.linkedin.com/documents/profile-fields

要获取电子邮件字段,您需要将请求令牌 url 修改为

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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 MVC4 中使用 DotNetOpenAuth 的 LinkedIn 完整个人资料详细信息 的相关文章

  • ASP.Net Web Api 未在 POST 上绑定模型

    我正在尝试将 JSON 数据发布到 Web Api 方法 但 JSON 数据未绑定到模型 这是我的模型 DataContract public class RegisterDataModel DataMember IsRequired tr
  • 防伪令牌和网络测试

    我正在尝试在 VS2012 中为 MVC 网站进行 Web 测试 其中一种情况是登录并浏览产品列表 选择您想要的产品并进入购买页面 问题是 当运行网络测试时 我收到有关防伪令牌的错误 并且它不匹配 到底如何才能用防伪令牌进行测试呢 用户mu
  • 我们已经让 MEF 与 MVC4 一起工作,那么基于约定的模型怎么样?

    经过深入研究 我发现可以在 MVC4 中使用 MEF 进行 DI 下面的 SO 链接给出了几个示例 如何将 MEF 与 ASP NET MVC 4 和 ASP NET Web API 集成 https stackoverflow com q
  • 使用 Azure AD OAuth 身份验证从 Azure 计划程序调用 API 应用程序时“未经授权”

    我有一个 API 应用程序 已通过 Azure Active Directory 身份验证对其进行保护 我想使用 Azure Scheduler 调用此 API 应用程序的操作 我在 Scheduler 操作中输入了租户 ID 客户端 ID
  • 验证仅适用于数组的第一项

    给定这个模型代码 Required Display Name Name public string Name get set 以下查看代码有效 Html LabelFor model gt model Name Html TextBoxFo
  • Windows Workflow Foundation 4 和 ASP.NET MVC

    我们正在评估 Windows Workflow Foundation 4 在基于 MVC 3 的 Web 应用程序中的使用 我们希望为不同的项目创建灵活的订单工作流程 有人知道有关此类应用程序的一般架构或实践实验室的详细信息吗 一些具体问题
  • 从一个项目调用控制器到另一个项目

    我正在使用 Asp net MVC4 和 razor 我想知道如何在同一解决方案中从一个项目调用控制器到另一个项目 我是 MVC4 的新手 您可以简单地将控制器添加到另一个项目 类库或 MVC 项目等 我们有几个共享控制器的项目 webAP
  • MVC 4 RC - Aspnet_regsql.exe

    我正在尝试使用 MVC 4 RC 默认模板启用登录 我以与 MVC 3 中相同的方式进行操作 Aspnet regsql exe gt SQL 服务器 然后我让连接字符串指向 SQL 服务器 当我尝试注册新用户时 我得到以下信息 Serve
  • 尝试在 Spring MVC 中使用 OAuth 保护资源

    我们已经在 Spring MVC 上使用 Java 编写了 REST Web 服务 我一直在努力保护它们 OAuth 服务器在另一个网站中实现 该网站处理登录和访问令牌的创建 因此 在允许用户访问网络服务之前 我需要验证访问令牌是否正确 然
  • 使用 Python 3 从 Twitter API 检索请求令牌

    我正在尝试使用 Python 3 与 Twitter API 交互 以返回页面的链接 该页面为我提供了用于请求访问令牌的 PIN 码 详细信息如下 https dev twitter com docs auth pin based auth
  • Google 服务帐户用户界面

    我怎样才能登录谷歌服务帐户 https developers google com identity protocols OAuth2ServiceAccount使用普通的网络用户界面 例如谷歌驱动器 https www google co
  • MVC4 中的 ELMAH 和 API 控制器不记录错误

    在 MVC4 中使用 API 控制器 当控制器操作引发异常时 ELMAH 不会记录错误 我认为问题在于 MVC4 将 HTTP 状态代码设置为 500 并且它返回 JSON 对象中的异常详细信息 但它不会抛出未处理的异常 因此 ELMAH
  • 如何在 MVC4 Razor 中使用 CheckBoxList 和 DropdownList

    我必须使用 Html CheckBoxListFor 或 Html DropdownListFor 当我使用列表进行模型绑定时 我对如何在视图中使用这些帮助器类感到困惑 将列表绑定到 CheckBoxList 和 DropdownList
  • 在 android 中使用路标请求访问令牌时收到 401

    这是我的代码 我不断收到异常 授权失败 服务器回复 401 如果消费者密钥不正确或签名不匹配 则可能会发生这种情况 在这一行 provider retrieveAccessToken consumer verifier 我已经三次检查了我的
  • 从 BitBucket 请求 OAuth 令牌

    在过去的 4 个小时里 我一直在尝试将 BitBucket 集成到我的应用程序中 但没有成功 在阅读的过程中BitBucket 的 RESTful API 文档 https confluence atlassian com display
  • 在 Visual Studio 中将域名从 localhost 更改为自定义名称

    我是 MVC 新手 我刚刚在 VS 2010 中创建了一个 MVC4 测试项目 它运行正常 但 url 是http 本地主机 60826 http localhost 60826 我想把它改成http my test site http m
  • MVC4优化如何允许部分视图脚本?

    部分视图和 MVC 的一个问题是 如果您的可重用部分视图需要某些 JavaScript 则无法包含它并将其加载到页面底部的脚本部分 除了性能问题之外 这意味着像 jquery 这样必要的东西还不存在 你必须使用任何依赖 jquery 的代码
  • 使用 ImageResizer 获取图像尺寸的最佳方法

    我正在将现有的 MVC 4 网站从自制用户文件上传切换为在上传时使用 ImageResizer 调整文件大小 我在文档中看到我不应该使用 System Drawing 但我无法找出任何其他获取图像尺寸的方法 尺寸是来自原始图像还是调整大小的
  • 有条件地在 html.RadioButtonFor (MVC4/Razor) 中包含选中的属性

    当您在手动编码的 html 元素 例如单选按钮 中显式包含 checked 属性时 您可以使用 bool 来确定该属性是否存在于该元素上正如这里所看到的 http www davidhayden me blog conditional at
  • 为什么我的 Facebook 访问令牌突然停止工作? “OAuthException:验证访问令牌时出错。”

    我有一个 iframe Facebook 应用程序 它使用 Facebook PHP SDK 进行身份验证并进行 api 调用 在身份验证过程中 系统会提示用户输入基本信息和离线访问 如果他们允许我的应用程序访问 Facebook 会将它们

随机推荐

  • 在php中从json_decode()获取值时出错?

    我有一个示例代码 description 2G Network GSM 850 900 1800 1900 3G Network HSDPA 850 900 1700 1900 2100 data json decode descripti
  • haskell中完整的缩进规则集

    从哪里可以获得 Haskell 代码编写的完整缩进规则集 过去的问题与我的以下问题类似 导致我提出上述问题 错误消息背后的原因是什么 parse error on input something 我收到的错误消息 Baby hs 103 2
  • 如何获取 git 中多个项目的任何分支中特定用户的提交列表?

    我在多个 git 项目的多个分支工作 我想获得所有这些项目和分支中特定日期的提交列表 用于时间表目的 虽然我可以为此目的编写实用程序脚本 但我不想重新发明轮子 有没有一种简单的方法可以使用现有的基于 UNIX 的工具或一些 git 高级用户
  • 选择两个 IP 范围之间的记录

    我有一张桌子 里面存放着ID Name Code IPLow IPHigh例如 1 Lucas 804645 192 130 1 1 192 130 1 254 2 Maria 222255 192 168 2 1 192 168 2 25
  • 将类型添加到 std 命名空间

    是否可以接受向std命名空间 例如 我想要一个 TCHAR 友好的字符串 那么以下可以接受吗 include
  • sass 无法编译,文件不可读或找不到

    转换错误 Jekyll Converters Sass 在转换时遇到错误 ng assets css all sass 找不到或无法读取要导入的文件 1 tools tools dir 1号线 这是我每次运行 Jekyll 时都会遇到的错误
  • 根据名称选择列表元素

    我有一个指定的向量列表 表示源自 2 个样本 A 和 B 的事件 l temp lt list SF1 t A c rep 1 10 SF2 t A c rep 9 15 SF1 t B c rep 8 12 l temp SF1 t A
  • 如何在 PDFSharp 中遍历 Pdf 对象树?

    我正在尝试使用 C 中的 PDFSharp 遍历现有 PDF 文档中的 PdfItem 对象树 我想创建一个所有对象的层次结构 类似于 PDF Explorer 示例所做的 但我希望它是一棵树而不是所有对象的平面列表 根节点是 docume
  • 函数模板的 typedef 的最佳替代方案?

    我想做的是这样的 template
  • Rails 5 Action Cable 与 Nginx、Puma 和 Redis 一起部署

    我正在尝试使用 Capistrano 将启用 Action Cable 的应用程序部署到 VPS 我正在使用 Puma Nginx 和 Redis 用于电缆 经过几个障碍后 我能够让它在本地开发环境中运行 我正在使用默认的进程内 cable
  • ASP.Net 6自定义WebApplicationFactory抛出异常

    我正在将现有的 ASP Net 5 Web 应用程序迁移到 ASP Net 6 并遇到了通过集成测试的最后障碍 我自定义 WebApplicationFactory 并抛出异常 Changing the host configuration
  • 打印浮点型/双精度型而不带尾随零? [复制]

    这个问题在这里已经有答案了 有几个与此相关的问题 但我还没有看到正确回答这个问题的人 我想打印一个浮点数 但我希望小数位数是自适应的 举个例子 0 gt 0 1234 gt 1234 0 1234 gt 0 1234 0 3 gt 0 3
  • Python pandas dataframe:找到另一列的每个唯一值的最大值

    我有一个大型数据框 从 500k 到 1M 行 其中包含例如这 3 个数字列 ID A B 我想过滤结果以获得如下图所示的表格 其中对于列 id 的每个唯一值 我都有 A 和 B 的最大值和最小值 我能怎么做 编辑 我已经更新了下面的图像以
  • 缩短 GCC 错误消息

    每当gcc无法找到具有多个重载的函数的匹配重载 它会给出一行又一行的错误 解释尝试了哪个重载以及为什么不使用它 虽然它通常很有用 但也常常没有用 因为问题是调用站点上的一个简单的拼写错误 在这种特殊情况下 它甚至没有帮助 因为甚至需要相当长
  • 如何通过比较两个 C# 对象来创建 JsonPatchDocument?

    鉴于我有两个相同类型的 C 对象 我想比较它们以创建 JsonPatchDocument 我有一个 StyleDetail 类定义如下 public class StyleDetail public string Id get set pu
  • Firebase集合组查询ID/密钥[重复]

    这个问题在这里已经有答案了 我一直在关注以下文档 https firebase google com docs firestore query data queries collection group query https fireba
  • 打破浮动图像周围的长词

    我正在尝试在移动设备上创建页面显示 它的布局是这样的 some text around the image some image text around the image some text around the image some w
  • Django - TypeError - save() 得到了意外的关键字参数“force_insert”

    我是 Django 新手 我无法弄清楚这个错误 请帮助 它给出了 TypeError save 得到了意外的关键字参数 force insert 我测试了下面的代码 他们能够保存新用户注册 但现在它不会再保存了 这是我认为有问题的views
  • 以编程方式添加选项卡,C# 选项卡控件

    大家好 我想问一下 如何以编程方式添加选项卡 对于我的问题 我有一个选项卡控件 默认情况下只有一个选项卡 我有一个按钮 当我单击该按钮时 将添加另一个选项卡 所以将是两个选项卡 请帮助我使用 c 和 xaml tabControl Item
  • 在 MVC4 中使用 DotNetOpenAuth 的 LinkedIn 完整个人资料详细信息

    我的 MVC4 应用程序允许使用 LinkedIn 帐户登录 我想提取登录用户的 linkedIn 中可用的所有详细信息 目前我做了以下工作 在我的 AuthConfig cs 中 Dictionary