3

我正在使用 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,但也包含授权部分。

4

4 回答 4

10

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

首先,创建一个新的 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);
    }
}

重要的部分是将响应转换为 ITokenSecretContainingMessage。似乎响应一直都有 TokenSecret,但它只是在内部属性上。通过投射它,您可以访问公共财产。我不能说我喜欢这样做,但是我也不明白为什么DotNetOpenAuth Asp.Net 团队首先隐藏了该属性。一定有充分的理由。

然后在 AuthConfig 中注册这个客户端:

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

现在,在 AccountController 的 ExternalLoginCallback 方法中,extraData 字典中提供了 accessSecret。

于 2013-02-26T23:06:32.380 回答
2

该类DotNetOpenAuth.AspNet.Clients.TwitterClient只允许身份验证,不允许授权。因此,如果您使用该类,您将无法以该用户的身份发布推文。

相反,您可以使用DotNetOpenAuth.ApplicationBlock.TwitterConsumer没有此限制的 ,您甚至可以将此类型的源代码复制到您的应用程序中并根据需要对其进行扩展。

您应该能够增强TwitterConsumer该类(一旦将其复制到您自己的项目中)以实现所需的接口,以便OAuthWebSecurity该类接受它。否则,您可以直接使用TwitterConsumer自己来验证和授权您的 Web 应用程序,这样用户只能看到一次 Twitter,但您可以获得所需的所有控制权。毕竟,使用 ASP.NET 的人TwitterConsumer早在 Twitter 出现之前就已经在使用登录和授权后续调用 Twitter 了OAuthWebSecurity

于 2012-08-30T22:04:18.073 回答
1

对于在 AuthConfig.cs 而不是 Microsoft.Web.WebPages.OAuth (MVC4 Internet Application) 中引用 Microsoft.AspNet.Membership.OpenAuth 的 WebForms 项目模板,我能够修改 Paul Manzotti 的答案以使其正常工作:

  1. 创建一个派生自 DotNetOpenAuth.AspNet.Clients.TwitterClient 的自定义 Twitter 客户端类

    公共类 CustomTwitterClient : TwitterClient { public CustomTwitterClient(string consumerKey, string consumerSecret) : base(consumerKey, consumerSecret) { }

    protected override AuthenticationResult VerifyAuthenticationCore(AuthorizedTokenResponse response)
    {
        //return base.VerifyAuthenticationCore(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);
    }
    

    }

  2. 在 AuthConfig.cs 中添加自定义客户端

    public static void RegisterOpenAuth()
    {
        OpenAuth.AuthenticationClients.Add("Twitter", () => new CustomTwitterClient(
            consumerKey: ConfigurationManager.AppSettings["twitterConsumerKey"], 
            consumerSecret: ConfigurationManager.AppSettings["twitterConsumerSecret"]));
    }
    

多多!现在您可以访问秘密了。

于 2013-08-23T23:44:44.197 回答
0

您可以通过设计自己的 TokenManager 从 OAuthWebSecurity 中提取 oauth_token_secret。当您在 OAuthWebSecurity.RegisterClient 中注册您的 Twitter 客户端时,您可以注册令牌管理器。

我使用此方法提取所需的值,以便能够绕过 Linq-to-Twitter 库的授权步骤。

我很快就会在我的博客上发布我的解决方案。

于 2013-02-02T07:56:32.927 回答