在 MVC4 中使用 DotNetOpenAuth 获取 Twitter 访问密钥

2023-12-04

我正在使用 MVC4 创建一个应用程序,该应用程序将授权用户使用 Twitter,并允许他们也从该应用程序发送推文。我可以使用 MVC4 中的BuiltInOAuthClient.Twitter 毫无问题地对用户进行身份验证。http://www.asp.net/web-pages/tutorials/security/enabling-login-from-external-sites-in-an-aspnet-web-pages-site

我有访问令牌和 oauth_verifier,但我还需要从 Twitter 获取 acess_secret。https://dev.twitter.com/docs/auth/implementing-sign-twitter

我缺少的是如何将 oauth_verifier 传递回 Twitter 以使用 OAuthWebSecurity 获取访问密钥。

同样,我可以使用 Twitter 进行登录,但我也需要能够使用 Twitter 作为用户。我之前已经使用 TweetSharp 库完成了此操作,但我尝试在此项目上使用 DotNetOpenAuth。

更新: 我正在使用第一个链接中所述的 OAuthWebSecurity 类来管理身份验证。 AuthConfig 中的 OAuthWebSecurity.RegisterClient 需要 DotNetOpenAuth.AspNet.IAuthenticationClient。您不能按照建议将其与 TwitterConsumer 类交换。

我可以使用第一个链接中所述的“内置”DotNetOpenAuth 身份验证部分,或者我可以使用自定义代码来进行完整授权,但我正在尝试找到一种方法来完成这两个任务。

我可以单独执行此操作,但随后会向用户显示两次 Twitter 对话框(一次用于登录,一次用于授权)。我希望有一种方法可以使用已经连接的身份验证部分,该身份验证部分使用 OAuthWebSecurity,但也添加授权部分。


这几天我一直在用头撞墙,但我终于找到了有用的东西。有兴趣知道这是否是一个有效的解决方案!

首先,创建一个新的 OAuthClient:

public class TwitterClient : OAuthClient
{
    /// <summary>
    /// The description of Twitter's OAuth protocol URIs for use with their "Sign in with Twitter" feature.
    /// </summary>
    public static readonly ServiceProviderDescription TwitterServiceDescription = new ServiceProviderDescription
    {
        RequestTokenEndpoint =
            new MessageReceivingEndpoint(
                "https://api.twitter.com/oauth/request_token",
                HttpDeliveryMethods.GetRequest | HttpDeliveryMethods.AuthorizationHeaderRequest),
        UserAuthorizationEndpoint =
            new MessageReceivingEndpoint(
                "https://api.twitter.com/oauth/authenticate",
                HttpDeliveryMethods.GetRequest | HttpDeliveryMethods.AuthorizationHeaderRequest),
        AccessTokenEndpoint =
            new MessageReceivingEndpoint(
                "https://api.twitter.com/oauth/access_token",
                HttpDeliveryMethods.GetRequest | HttpDeliveryMethods.AuthorizationHeaderRequest),
        TamperProtectionElements = new ITamperProtectionChannelBindingElement[] { new HmacSha1SigningBindingElement() },
    };

    public TwitterClient(string consumerKey, string consumerSecret) :
        base("twitter", TwitterServiceDescription, consumerKey, consumerSecret) { }

    /// Check if authentication succeeded after user is redirected back from the service provider.
    /// The response token returned from service provider authentication result. 
    protected override AuthenticationResult VerifyAuthenticationCore(AuthorizedTokenResponse response)
    {
        string accessToken = response.AccessToken;
        string accessSecret = (response as ITokenSecretContainingMessage).TokenSecret;
        string userId = response.ExtraData["user_id"];
        string userName = response.ExtraData["screen_name"];

        var extraData = new Dictionary<string, string>()
                            {
                                {"accesstoken", accessToken},
                                {"accesssecret", accessSecret}
                            };
        return new AuthenticationResult(
            isSuccessful: true,
            provider: ProviderName,
            providerUserId: userId,
            userName: userName,
            extraData: extraData);
    }
}

The important part is where you cast the response to an ITokenSecretContainingMessage. It appears that the response has the TokenSecret all along, but it is only on an internal property. By casting it, you get access to a public property. I can't say that I'm a fan of doing this, but then I also don't understand why DotNetOpenAuth the Asp.Net team have hidden the property in the first place. There must be a good reason.

然后您在 AuthConfig 中注册该客户端:

OAuthWebSecurity.RegisterClient( new TwitterClient(
    consumerKey: "",
    consumerSecret: ""), "Twitter", null);

现在,在 AccountController 上的ExternalLoginCallback 方法中,accessSecret 在ExtraData 字典中可用。

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

在 MVC4 中使用 DotNetOpenAuth 获取 Twitter 访问密钥 的相关文章

随机推荐

  • 安装 mediapipe 库后 cv2 不起作用

    我想使用 python 制作 handtracker 程序 但教程告诉我安装 mediapipe 库 然后我安装了它 之前使用cv2传输我的相机是可以的 但是安装mediapipe之后 cv2不起作用 这里是消息 gt gt gt impo
  • 对已经排序的数组进行快速排序

    在这个问题中 https www quora com What is randomized quicksort 阿莱霍 豪斯纳 Alejo Hausner 说道 最坏情况下快速排序的成本 that 讽刺的是 如果您将快速排序应用于已经排序的
  • 自动生成 .NET 故障转储

    我知道如何使用 ADPlus 或 DebugDiag 生成故障转储文件 但我想知道是否有一种方法可以在客户的计算机上执行此操作而无需安装这些工具 具体来说 我希望能够配置我的应用程序 例如 使用注册表值 在发生严重故障时生成故障转储 更具体
  • 如何删除字符串的一部分?

    假设我有test 23我想删除test 我怎么做 前面的前缀 可以换 我最喜欢的方法是 拆分和弹出 var str test 23 alert str split pop gt 23 var str2 adifferenttest 153
  • 在 Eclipse Android 中导入 JAR (JAudioTagger)

    我正在开发一个加载 mp3 文件的歌曲数据的程序 我正在尝试导入 JAudioTagger 来帮助加载歌曲信息 JAudioTagger 是一个 jar 文件 我进入导入窗口 但面临许多我不确定的导入选项 看起来有三种可行的选择 EJB J
  • 如何创建项目模板

    关于自定义模板的主题 我正在自学如何使用 xcode 7 和 Objective C 来做到这一点 但我陷入了困境 到目前为止 通过阅读 S O 上的其他帖子我通过复制单视图应用程序并将其放入 xcode 包的正确目录中 成功创建了一个自定
  • mocha中的异步函数 before() 总是在 it() 规范之前完成?

    我有一个回调函数before 这是为了清理数据库 一切都在before 保证在之前完成it 开始 before function db collection user remove function res is it guaranteed
  • 如何在R中获得与Stata中相同的AIC和BIC值?

    假设我有一个非常简单的模型 library foreign smoke lt read dta http fmwww bc edu ec p data wooldridge smoke dta smoking reg lt lm cigs
  • 在 C 中如何将函数作为参数传递?

    我想创建一个函数 该函数对一组数据执行通过参数传递的函数 在 C 中如何将函数作为参数传递 宣言 采用函数参数的函数原型如下所示 void func void f int 这表明参数f将是一个指向函数的指针 该函数具有void返回类型并且需
  • 获取最后更新的数据 - Codeigniter

    我在 codeigniter 工作 我有一个方案表 我的问题是我想显示每个方案的最后更新数据 我不知道该怎么做 请帮忙 my table scheme code updated on scheme name 1 2015 04 13 One
  • 使用ejabberd时有没有办法打包msg?

    我正在测试 ejabberd 的 mucroom 测试客户是Tsung 测试条件 一台ejabberd服务器 4核16G RAM 3000 个用户加入 1 个 mucroom 用户1分钟内随机发送一条消息 每个用户发送5条消息 服务器操作系
  • 将网页另存为PDF到指定目录

    我有它会打开 Internet Explorer 给用户 另存为 框 然后退出 但是 我更希望用户不必导航到正确的文件夹 而是目录来自工作表中的单元格并将网页另存为 PDF 我已经安装了完整的 Adob e 代码 Sub WebSMacro
  • 管理文件共享上的远程 DACL:Win32_ACE 到 Win32_Share

    目标 向现有文件共享添加本地用户帐户共享级读 写权限 我在开发这个方面遇到了障碍 显然 Microsoft 希望您将用户的 ACE 添加到 DACL 然后返回到共享的安全描述符中 1 不 NET SHARE ADD 不适用于现有共享 我很惊
  • 使用龙卷风处理标准输入

    如何监听 Tornado 循环中 stdin 上发生的事件 特别是 在龙卷风系统中 我想从标准输入中读取数据 对其做出反应 并在标准输入关闭时终止 同时 Tornado Web 服务也在同一进程上运行 在寻找这个时 我能找到的最相似的是处理
  • 电子邮件身份验证(Gmail、Yahoo 等)--android [重复]

    这个问题在这里已经有答案了 我对这个主题还很陌生 是否可以一次性验证所有电子邮件 ID 实际需要是我想在我的应用程序中验证电子邮件 gmail yahoo 等 一旦验证批准 它应该继续到我的应用程序 它可能是单点登录或其他什么 这可以做到吗
  • 将对象转换为派生类的对象

    我有课Record效果很好 public class Record protected string table protected string idcolumn public Record string table string idc
  • 如何让awk忽略双引号内的字段分隔符? [复制]

    这个问题在这里已经有答案了 我需要删除逗号分隔值文件中的 2 列 考虑 csv 文件中的以下行 email protected www example com field2 field3 field4 email protected fie
  • 如何在 React 中循环一个对象?

    React 新手 尝试循环对象属性 但 React 抱怨对象不是有效的 React 子对象 有人可以给我一些关于如何解决此问题的建议吗 我已经添加了 createFragment 但不完全确定需要去哪里或者我应该采取什么方法 JS var
  • 获取 mongoid 生成的原始 mongo db 查询表达式

    我想获取 mongoid 生成的 mongo 查询表达式该怎么做 例如这是 mongoid 语法 History where report type params report type order by ts 1 only ts last
  • 在 MVC4 中使用 DotNetOpenAuth 获取 Twitter 访问密钥

    我正在使用 MVC4 创建一个应用程序 该应用程序将授权用户使用 Twitter 并允许他们也从该应用程序发送推文 我可以使用 MVC4 中的BuiltInOAuthClient Twitter 毫无问题地对用户进行身份验证 http ww