翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
SAML Amazon Cognito ユーザープールでのセッション開始
Amazon Cognito は、サービスプロバイダー主導 (SP 開始) シングルサインオン (SSO) と IdP 開始 をサポートしていますSSO。セキュリティのベストプラクティスとして、ユーザープールSSOに SP 開始を実装します。 SAML V2.0 技術概要のセクション 5.1.
一部のエンタープライズユースケースでは、内部アプリケーションへのアクセスは Enterprise IdP がホストするダッシュボードのブックマークから始まります。ユーザーがブックマークを選択すると、IdP はSAMLレスポンスを生成して SP に送信し、アプリケーションでユーザーを認証します。
ユーザープールで SAML IdP を設定して、IdP 開始 をサポートできますSSO。IdP 開始認証をサポートしている場合、Amazon Cognito はSAMLリクエストを使用して認証を開始しないため、Amazon Cognito は受信したSAMLレスポンスをリクエストしたことを確認できません。SP 開始 ではSSO、Amazon Cognito は元のリクエストに対するSAMLレスポンスを検証する状態パラメータを設定します。SP 開始サインインを使用すると、クロスサイトリクエストの偽造 () を防ぐこともできますCSRF。
SP 開始SAMLサインインの使用
ベストプラクティスとして、ユーザープールに service-provider-initiated (SP 開始) サインインを実装します。Amazon Cognito はユーザーのセッションを開始し、IdP にリダイレクトします。この方法では、サインインリクエストを提示するユーザーを最も制御できます。特定の条件下で IdP 開始サインインを許可することもできます。
以下のプロセスは、ユーザーがSAMLプロバイダーを通じてユーザープールへの SP 開始サインインを完了する方法を示しています。
-
ユーザーはサインインページで E メールアドレスを入力します。ユーザーの IdP へのリダイレクトを確認するには、カスタムアプリケーションで E メールアドレスを収集するか、ウェブビューでホストされた UI を呼び出します。ホストされた UI を設定して、 のリストを表示する IdPs か、E メールアドレスのみを求めるようにすることができます。
-
アプリはユーザープールリダイレクトエンドポイントを呼び出し、アプリに対応するクライアント ID とユーザーに対応する IdP ID を持つセッションをリクエストします。
-
Amazon Cognito は、
AuthnRequest
要素でオプションで署名された SAML リクエストを使用して、ユーザーを IdP にリダイレクトします。 -
IdP は、インタラクティブに、またはブラウザ Cookie で記憶されたセッションを使用してユーザーを認証します。
-
IdP は、ペイPOSTロード内のオプションで暗号化されたSAMLアサーションを使用して、ユーザーをユーザープールSAMLレスポンスエンドポイントにリダイレクトします。
注記
Amazon Cognito は、5 分以内にレスポンスを受信しないセッションをキャンセルし、ホストされた UI にユーザーをリダイレクトします。ユーザーがこの結果を経験すると、
Something went wrong
エラーメッセージを受け取ります。 -
SAML アサーションを検証し、レスポンスのクレームからユーザー属性をマッピングすると、Amazon Cognito はユーザープールでユーザーのプロファイルを内部的に作成または更新します。通常、ユーザープールはユーザーのブラウザセッションに認証コードを返します。
-
ユーザーは、認証コードをアプリケーションに提示します。アプリケーションはコードをJSONウェブトークン () と交換しますJWTs。
-
アプリはユーザーの ID トークンを認証として受け入れて処理し、アクセストークンを使用してリソースへの承認されたリクエストを生成し、更新トークンを保存します。
ユーザーが認証コード許可を認証して受け取ると、ユーザープールは ID、アクセス、および更新トークンを返します。ID トークンは、 OIDCベースの ID 管理用の認証オブジェクトです。アクセストークンは、スコープが OAuth2.0
更新トークンの期間を選択することもできます。ユーザーの更新トークンの有効期限が切れたら、再度サインインする必要があります。SAML IdP を介して認証された場合、ユーザーのセッション期間は、IdP とのセッションの有効期限ではなく、トークンの有効期限によって設定されます。アプリは、各ユーザーの更新トークンを保存し、有効期限が切れたらセッションを更新する必要があります。ホストされた UI は、1 時間有効なブラウザ Cookie でユーザーセッションを維持します。
IdP 開始SAMLサインインの使用
IdP 開始 SAML 2.0 サインイン用に ID プロバイダーを設定すると、 でセッションを開始することなく、ユーザープールドメイン内のsaml2/idpresponse
エンドポイントにアSAMLサーションを提示できます認可エンドポイント。この設定を持つユーザープールは、リクエストされたアプリケーションクライアントがサポートするユーザープールの外部 ID プロバイダーからの IdP 開始SAMLアサーションを受け入れます。次の手順では、IdP 開始 SAML 2.0 プロバイダーを設定してサインインする全体的なプロセスについて説明します。
-
ユーザープールとアプリケーションクライアントを作成または指定します。
-
ユーザープールに SAML 2.0 IdP を作成します。
-
IdP 開始をサポートするように IdP を設定します。IdP 主導では、他のSSOプロバイダーが対象とならないセキュリティ上の考慮事項SAMLが導入されています。このため、IdP 開始サインインを持つSAMLプロバイダーを使用するアプリケーションクライアントにSAML IdPs、ユーザープール自体を含む 以外の を追加することはできません。
-
IdP 開始SAMLプロバイダーをユーザープール内のアプリケーションクライアントに関連付けます。
-
IdP SAML のサインインページにユーザーを誘導し、SAMLアサーションを取得します。
-
SAML アサーションを使用してユーザープール
saml2/idpresponse
エンドポイントにユーザーを誘導します。 -
JSON ウェブトークン () を受信しますJWTs。
ユーザープールで一方的なSAMLアサーションを受け入れるには、アプリケーションセキュリティへの影響を考慮する必要があります。リクエストスプーフィングとCSRF試行は、IdP 開始リクエストを受け入れるときに行われる可能性があります。ユーザープールは IdP 開始のサインインセッションを検証できませんが、Amazon Cognito はリクエストパラメータとSAMLアサーションを検証します。
さらに、SAMLアサーションにInResponseTo
クレームが含まれておらず、過去 6 分以内に発行されたものでなければなりません。
IdP で開始されたリクエストSAMLを に送信する必要があります/saml2/idpresponse
。SP 主導のホストされた UI 認証リクエストの場合、リクエストされたアプリケーションクライアント、スコープ、リダイレクト URI、およびその他の詳細をHTTP GET
リクエストのクエリ文字列パラメータとして識別するパラメータを指定する必要があります。ただし、IdP が開始するSAMLアサーションの場合、リクエストの詳細はHTTP POST
リクエスト本文のRelayState
パラメータとしてフォーマットする必要があります。リクエスト本文には、SAMLアサーションをSAMLResponse
パラメータとして含める必要があります。
以下は、IdP 開始SAMLプロバイダーのリクエスト例です。
POST /saml2/idpresponse HTTP/1.1 User-Agent:
USER_AGENT
Accept: */* Host:example.auth.us-east-1.amazoncognito.com
Content-Type: application/x-www-form-urlencoded SAMLResponse=[Base64-encoded SAML assertion]
&RelayState=identity_provider%3DMySAMLIdP
%26client_id%3D1example23456789
%26redirect_uri%3Dhttps%3A%2F%2Fwww.example.com
%26response_type%3Dcode
%26scope%3Demail%2Bopenid%2Bphone
HTTP/1.1 302 Found Date: Wed, 06 Dec 2023 00:15:29 GMT Content-Length: 0 x-amz-cognito-request-id: 8aba6eb5-fb54-4bc6-9368-c3878434f0fb Location:https://www.example.com
?code=[Authorization code]