6

私は DotNetOpenAuth を使用して、OAuth2 経由で Facebook と Google に接続しています。OAuth 仕様では、request_uri に追加のパラメーターを指定しないよう求めています。実際、Google は、Google アプリを定義するときに正確なコールバック uri を指定することを強制することで、これをある程度強制しています。

私が達成したいのは、Facebook または Google で認証された後、ユーザーを特定の URL に戻せるようにすることです。フローは次のとおりです。ユーザーが保護されたリンクをクリックすると、returnUrl パラメーターを使用してログイン ページに転送され、選択した OAuth2 承認サーバーに基づいて承認プロセスが開始されます。

request_uri にはパラメーターを含めることができないため (Facebook ではこれを回避できますが)、returnUrl パラメーターを承認サーバーに送信して、ユーザーがサイトに戻ったときにそれを取得することはできません。アクセスしようとしていた保護されたページに転送します。私にできる最善のことは、それらをホームページまたはメンバーのウェルカム ページに転送することです。

これを修正する方法は、認可サーバーが request_uri に返す "state" パラメータを使用することですが、DotNetOpenAuth でこれを指定する方法が見つかりません。

デフォルトでは、コードは状態パラメーターとして SessionID を使用して、承認サーバーから返される要求を検証しているようです。WebServerClient クラスで IClientAuthorizationTracker を指定すると、承認サーバーから応答が返ってきたときにロジックをプラグインできますが、承認要求の準備中にロジックが呼び出されないため、追加の状態をプラグインできません。

これは、WebServerClient.cs の PrepareRequestUserAuthorization のコードです。

            // Mitigate XSRF attacks by including a state value that would be unpredictable between users, but
        // verifiable for the same user/session.
        // If the host is implementing the authorization tracker though, they're handling this protection themselves.
        if (this.AuthorizationTracker == null) {
            var context = this.Channel.GetHttpContext();
            if (context.Session != null) {
                request.ClientState = context.Session.SessionID;
            } else {
                Logger.OAuth.WarnFormat("No request context discovered, so no client state parameter could be set to mitigate XSRF attacks.");
            }
        }

ここにはelseブロックはありません。これは、私が一緒に遊んで自分のデータをプラグインできると期待していたものです。

私が見逃しているものに関するヒントはありますか?

4

1 に答える 1

0

状態パラメーターは、必然的に XSRF 攻撃の軽減に専念しています。returnUrl既にユーザー セッションがあるので、セッション ディクショナリに保存できますか?

または、 DotNetOpenAuthで問題を提出して、独自のデータを状態パラメーターにバンドルすることを許可するように依頼することもできます (DNOA 独自の XSRF 軽減コードと共に)。

于 2012-08-23T14:10:36.243 に答える