4

このシナリオがあります。企業サイト (MVC 4) と Web ショップです。OAuth 2 SSO 機能を追加します。どちらのサイトにも独自のメンバーがいますが、企業サイト (私が担当) も OAuth 2 認証サーバーとして機能する必要があり、各メンバーの Web ショップ ユーザー ID を保存します。ショップは次のエンドポイントを要求しました。

認証エンドポイント

• 認可:

    …/oauth2/authorize?client_id={CLIENT_ID}&state={STATE}&response_type=code&redirect_uri={REDIRECT_URI}

• トークン

    …/oauth2/token?code={TOKEN}&client_id={CLIENT_ID}&client_secret={CLIENT_SECRET}&redirect_uri={REDIRECT_URI}&grant_type=authorization_code

    …/oauth2/token?refresh_token={TOKEN}&client_id={CLIENT_ID}&client_secret={CLIENT_SECRET}&redirect_uri={REDIRECT_URI}&grant_type=refresh_token

API エンドポイント

• getid (メンバーのショップ ID を含む JSON を返します):

    …/oauth2/api/getid?access_token={TOKEN}

私は OAuth の経験がないので、DotNetOpenAuth サンプルを見て、 OAuthAuthorizationServer を実装する必要があると結論付けました、私の要件に合わせてサンプルを変更することは、より多くのことを行うようで複雑であるため困難です。

DotNetOpenAuth の調査には非常に時間がかかるように思われるので、お聞きしたいのですが、OAuthAuthorizationServer サンプルを変更することは正しい方法ですか? または、ネイティブ実装を作成するか、自分の状況で使いやすい別の OAuth ライブラリを試す必要がありますか?

私の全体的な計画についてコメントしてください:

- 企業サイト メンバーのログイン フローを維持する 標準フォーム認証、簡単な LogOn コントローラー

-アクションとして 3 つの必要なエンドポイントを実装する OAuth コントローラーを追加します。

-承認アクションに到達すると、クライアントを検証し、logOn にリダイレクトして、redirect_uri を渡します。サンプルのfromから調査を開始し、 を返す必要があると思います。これは正しいです?Authorize ActionResultOAuthController.csAccountAuthorizeModel

- ユーザーがログインした後、認証エンドポイントからログイン ページに到達した場合は、コードを添付して redirect_uri にリダイレクトします。どこから始めればいいのかわからない。PrepareApproveAuthorizationRequestではPrepareResponse?コードはどこから来たのですか?フローのどこでデータベースに新しい ClientAuthorization を追加する必要がありますか?

-ショップはコードを使用して、/token エンドポイントからトークンを取得または更新します。単に戻るHandleTokenRequest

-トークンを使用すると、ショップ サイトはメンバー データの JSON を取得できます。トークンを検証する方法を見つける必要があります

ここで、クライアント ID とシークレットを格納する Clients テーブルと、誰が承認されたかを追跡する ClientAuthorization を追加する以外に、DotNetOpenAuth サンプルの他のテーブルが使用されているかどうか、いつ Nonce、SymmetricCryptoKey、User.

OAuth2AuthorizationServer.cs の変更は簡単に思えます。実際の証明書を追加し、クライアントがデータ コンテキストからプルされていることを確認するだけです。

ありがとう!

4

1 に答える 1

4

ほとんどの点であなたは正しいと思います。それらにコメントしましょう:

  • トークンの要求とトークンの更新は同じエンドポイント (TokenEndpoint) に送られるため、OAuth サーバーには 2 つのエンドポイント (3 つではなく) が必要です。

  • 別の認証サーバー (またはコントローラー) を実装するか、承認サーバー内に認証責任を実装するかによって異なります。それらが分離されている場合、認証サーバーは、ログオンの表示、認証、およびOpenIDプロトコルを使用した承認サーバーとの通信を担当する必要があります(DotNetOpenAuthでもサポートされています)。

  • ユーザーが認証されると、承認サーバーは何らかの方法でユーザー ID のデータを保存し、DotNetOpenAuth 関数を使用して (この Oauth フローを使用する場合) 承認コードを返す必要があります。

    var response = this.AuthServer.PrepareApproveAuthorizationRequest(AuthorizationRequest, User.Identity.Name); this.AuthServer.Channel.PrepareResponse(応答) を返します。finalResponse.AsActionResult();

認証プロセスについてデータベースに何も保存する必要はないと思います。コードは DotNetOpenAuth によって生成され、リダイレクトのクエリ文字列にクライアントに送信されます。

  • 次に、クライアントはコード (ProcessUserAuthorization) を取得し、TokenEndpoint を呼び出す必要があります。このエンドポイントは、CreateAccessToken などの一部の OAuthAuthorizationServer 関数を内部的に呼び出している HandleTokenRequest を返すだけです。

  • クライアントがアクセス トークンを取得したら、リソースを呼び出して、トークンを HTTP ヘッダーの「Authorization」に送信する必要があります。リソース サーバーは、トークンの検証を担当します。

    var resourceServer = new ResourceServer(new StandardAccessTokenAnalyzer(署名、暗号化));

     AccessToken token = resourceServer.GetAccessToken(request, scopes);
    

このフローを使用するには、nonce と crytoKeys のストア プロバイダーが必要です。次のクラス InMemoryCryptoKeyStore を見てください。

https://github.com/DotNetOpenAuth/DotNetOpenAuth/wiki/Security-scenarios

お役に立てれば!

于 2013-10-03T13:56:29.937 に答える