私は 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ブロックはありません。これは、私が一緒に遊んで自分のデータをプラグインできると期待していたものです。
私が見逃しているものに関するヒントはありますか?