Amazon Cognito ユーザープールでの SAML セッション開始
Amazon Cognito は、サービスプロバイダーが開始した (SP が開始した) シングルサインオン (SSO) と IdP が開始した SSO をサポートしています。セキュリティのベストプラクティスとして、SP が開始した SSO をユーザープールに実装します。SAML V2.0 技術概要
一部のエンタープライズユースケースでは、内部アプリケーションへのアクセスは Enterprise IdP がホストするダッシュボードのブックマークから始まります。ユーザーがブックマークを選択すると、IdP は SAML 応答を生成して SP に送信し、アプリケーションでユーザーを認証します。
IdP が開始した SSO をサポートするように、ユーザープールで SAML IdP を設定できます。IdP が開始した認証をサポートする場合、Amazon Cognito は SAML リクエストで認証を開始しないため、受信した SAML レスポンスを要請したことを検証できません。SP が開始した SSO では、Amazon Cognito は、元のリクエストに対して SAML レスポンスを検証する状態パラメータを設定します。SP が開始したサインインを使用すると、クロスサイトリクエストフォージェリ (CSRF) から保護することもできます。
SP が開始した SAML サインインの使用
ベストプラクティスとして、ユーザープールに、サービスプロバイダーが開始した (SP が開始した) サインインを実装します。Amazon Cognito はユーザーのセッションを開始し、IdP にリダイレクトします。この方法を使用すると、サインインリクエストを提示するユーザーの制御が最大になります。特定の条件下で、IdP が開始したサインインを許可することもできます。
以下のプロセスは、ユーザーが SAML プロバイダーを介してユーザープールへの SP が開始したサインインを完了する方法を示しています。

-
ユーザーはサインインページで E メールアドレスを入力します。ユーザーの IdP へのリダイレクトを判断するには、カスタムアプリケーションで E メールアドレスを収集するか、ウェブビューでホストされた UI を呼び出します。IdP のリストを表示するか、E メールアドレスのみを求めるようにホスト UI を設定できます。
-
アプリケーションは、ユーザープールリダイレクトエンドポイントを呼び出し、アプリケーションに対応するクライアント 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 ウェブトークン (JWT) と交換します。
-
アプリケーションは、ユーザーの ID トークンを認証として受け入れて処理し、アクセストークンを使用してリソースへの認可されたリクエストを生成し、更新トークンを保存します。
ユーザーが認証して、認可コード付与を受け取ると、ユーザープールは ID、アクセス、更新トークンを返します。ID トークンは、OIDC ベースの ID 管理用の認証オブジェクトです。アクセストークンは、OAuth 2.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 が開始した SAML では、他の SSO プロバイダーには適用されないセキュリティ上の考慮事項が導入されています。このため、IdP が開始したサインインで SAML プロバイダーを使用するアプリケーションクライアントに、ユーザープール自体を含む非 SAML IdP を追加することはできません。
-
IdP が開始した SAML プロバイダーを、ユーザープール内のアプリケーションクライアントに関連付けます。
-
SAML IdP のサインインページにユーザーを誘導し、SAML アサーションを取得します。
-
SAML アサーションを使用して、ユーザーをユーザープール
saml2/idpresponse
エンドポイントに誘導します。 -
JSON ウェブトークン (JWT) を受け取ります。
ユーザープールで未承諾の 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]