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

私が見逃しているのは、OAuthWebSecurityを使用してアクセスシークレットを取得するためにoauth_verifierをTwitterに戻す方法です。

繰り返しになりますが、ログインにはTwitterを使用できますが、ユーザーとしてもTwitterを使用できる必要があります。以前にTweetSharpライブラリでこれを実行しましたが、このプロジェクトでDotNetOpenAuthを使用しようとしています。

更新:認証を管理するための最初のリンクで説明されているように、OAuthWebSecurityクラスを使用しています。AuthConfigのOAuthWebSecurity.RegisterClientは、DotNetOpenAuth.AspNet.IAuthenticationClientを想定しています。提案されているように、TwitterConsumerクラスと交換することはできません。

最初のリンクで説明されているように、「組み込み」のDotNetOpenAuth認証部分を使用できます。または、カスタムコードを使用して完全な認証を行うこともできますが、両方を行う方法を見つけようとしています。

個別に行うこともできますが、ユーザーにはTwitterダイアログが2回表示されます(1回はログイン、もう1回は認証)。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 が含まれているように見えますが、これは内部プロパティのみです。キャストすることで、パブリック プロパティにアクセスできます。私はこれを行うのが好きだとは言えませんが、Asp.Net チームのDotNetOpenAuthが最初にプロパティを隠した理由も理解できません。正当な理由があるはずです。

次に、このクライアントを 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 を使用している人は、Twitter が存在TwitterConsumerするずっと前から、ログインとその後の Twitter への呼び出しの承認の両方に使用しOAuthWebSecurityていました。

于 2012-08-30T22:04:18.073 に答える
0

独自の TokenManager を設計することで、OAuthWebSecurity から oauth_token_secret を抽出できます。Twitter クライアントを OAuthWebSecurity.RegisterClient に登録するときに、トークン マネージャーを登録できます。

このメソッドを使用して、必要な値を抽出し、Linq-to-Twitter lib の認証ステップをバイパスできるようにしました。

私はすぐに私のブログに私の解決策を投稿します。

于 2013-02-02T07:56:32.927 に答える