SAML Amazon Cognito 使用者集區中的工作階段啟動 - Amazon Cognito

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

SAML Amazon Cognito 使用者集區中的工作階段啟動

Amazon Cognito 支援服務供應商啟動 (SP 啟動) 單一登入 (SSO) 和 IdP 啟動 SSO。作為最佳實務,請在使用者集區SSO中實作 SP 啟動。 SAML V2.0 技術概觀的第 5.1.2 節說明 SP 啟動的 SSO。Amazon Cognito 是您應用程式的身分提供者 (IdP)。此應用程式是一種服務供應商 (SP),會擷取已驗證使用者的權杖。但是,當您使用第三方 IdP 對使用者進行身分驗證時,Amazon Cognito 就是 SP。當您的 SAML 2.0 使用者使用 SP 啟動的流程進行身分驗證時,他們必須先向 Amazon Cognito 提出請求,並重新導向至 IdP 進行身分驗證。

對於某些企業使用案例,存取內部應用程式是從在企業 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 啟動的使用者集區登入。

Amazon Cognito SP 啟動SAML登入的身分驗證流程圖。
  1. 您的使用者會在登入頁面輸入其電子郵件地址。若要判斷使用者重新導向至其 IdP您可以在自訂應用程式中收集其電子郵件地址,或在 Web 檢視中叫用託管 UI。您可以設定託管 UI,以顯示 IdPs 或 的清單,以僅提示電子郵件地址。

  2. 您的應用程式會叫用您的使用者集區重新導向端點,並請求具有對應於應用程式的用戶端 ID 和對應於使用者的 IdP ID 的工作階段。

  3. Amazon Cognito 會在 AuthnRequest元素中使用SAML請求,選擇性地簽署 將使用者重新導向至 IdP。

  4. IdP 會以互動方式驗證使用者,或在瀏覽器 Cookie 中使用記住的工作階段進行驗證。

  5. IdP 會在使用者集區SAML回應端點POST的承載中使用選擇性加密的宣告來重新導向您的使用者。 SAML

    注意

    Amazon Cognito 會在 5 分鐘內取消未收到回應的工作階段,並將使用者重新導向至託管 UI。當您的使用者遇到此結果時,會收到Something went wrong錯誤訊息。

  6. 在驗證SAML聲明並從回應中的宣告映射使用者屬性之後,Amazon Cognito 會在內部建立或更新使用者集區中的使用者設定檔。一般而言,您的使用者集區會將授權碼傳回至使用者的瀏覽器工作階段。

  7. 您的使用者會向應用程式展示其授權碼,該應用程式會交換 JSON Web 權杖的程式碼 (JWTs)。

  8. 您的應用程式接受並處理使用者的 ID 權杖作為身分驗證,使用其存取權杖產生對資源的授權請求,並存放其重新整理權杖。

當使用者驗證並收到授權碼授予時,使用者集區會傳回 ID、存取和重新整理權杖。ID 權杖是 OIDC型身分管理的身分驗證物件。存取權杖是具有 OAuth2.0 範圍的授權物件。重新整理權杖是在使用者目前的權杖過期時產生新 ID 和存取權杖的物件。您可以在使用者集區應用程式用戶端中設定使用者權杖的持續時間。

您也可以選擇重新整理權杖的持續時間。使用者的重新整理權杖過期後,必須再次登入。如果使用者透過 SAML IdP 進行身分驗證,則使用者的工作階段持續時間會由其權杖到期而設定,而不是其工作階段與 IdP 的到期時間。您的應用程式必須儲存每個使用者的重新整理權杖,並在工作階段過期時更新其工作階段。託管 UI 會在瀏覽器 Cookie 中維護使用者工作階段,有效期間為 1 小時。

使用 IdP 啟動的SAML登入

當您為 IdP 啟動的 SAML 2.0 登入設定身分提供者時,您可以向使用者集區網域中的saml2/idpresponse端點提出SAML宣告,而無需在 啟動工作階段授權端點。具有此組態的使用者集區接受來自所請求應用程式用戶端支援之使用者集區外部身分提供者的 IdP 啟動SAML宣告。下列步驟說明使用 IdP 啟動的 SAML 2.0 供應商設定和登入的整體程序。

  1. 建立或指定使用者集區和應用程式用戶端。

  2. 在使用者集區中建立 SAML 2.0 IdP。

  3. 設定您的 IdP 以支援 IdP 啟動。IdP 啟動SAML引入其他SSO供應商不受約束的安全考量。因此,您無法將非 SAML IdPs,包括使用者集區本身,新增至使用具有 IdP 起始登入之SAML提供者的任何應用程式用戶端。

  4. 將 IdP 啟動的SAML提供者與使用者集區中的應用程式用戶端建立關聯。

  5. 將使用者引導至 IdP SAML 的登入頁面,並擷取SAML宣告。

  6. 將使用者引導至具有SAML聲明的使用者集區saml2/idpresponse端點。

  7. 接收 JSON Web 權杖 (JWTs)。

若要在使用者集區中接受主動SAML宣告,您必須考量其對應用程式安全性的影響。當您接受 IdP 發起的請求時,可能會請求欺騙和CSRF嘗試。雖然您的使用者集區無法驗證 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]
AWS Management Console
為 IdP 啟動設定 IdP SAML
  1. 建立使用者集區 應用程式用戶端 和SAML身分提供者。

  2. 如果有任何關聯,請取消所有社交和OIDC身分提供者與應用程式用戶端的關聯。

  3. 導覽至使用者集區的登入體驗索引標籤。

  4. 聯合身分提供者登入 下,編輯或新增SAML提供者。

  5. IdP 起始SAML登入 下,選擇接受 SP 起始和 IdP 起始SAML宣告

  6. 選擇 Save changes (儲存變更)。

API/CLI

為 IdP 啟動設定 IdP SAML

使用 CreateIdentityProviderUpdateIdentityProviderAPI請求中的 SAML IDPInit 參數設定 IdP 啟動。以下是支援 IdP 啟動 ProviderDetails 的 IdP 範例SAML。

"ProviderDetails": { "MetadataURL" : "https://myidp.example.com/saml/metadata", "IDPSignout" : "true", "RequestSigningAlgorithm" : "rsa-sha256", "EncryptedResponses" : "true", "IDPInit" : "true" }