

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

# 搭配使用者集區使用 SAML 身分提供者
<a name="cognito-user-pools-saml-idp"></a>

您可以選擇讓您的 Web 和行動應用程式使用者透過 SAML 身分提供者 (IdP) 登入，例如 [Microsoft Active Directory Federation Services (ADFS)](https://msdn.microsoft.com/en-us/library/bb897402.aspx) 或 [Shibboleth](http://www.shibboleth.net/)。您必須選擇支援 [SAML 2.0 標準](http://saml.xml.org/saml-specifications)的 SAML IdP。

透過受管登入，Amazon Cognito 會驗證本機和第三方 IdP 使用者，並發出 JSON Web 字符 JWTs)。使用 Amazon Cognito 發行的字符，您可以將多個身分來源合併到所有應用程式的通用 OpenID Connect (OIDC) 標準。Amazon Cognito 可以將第三方供應商的 SAML 聲明處理為該 SSO 標準。您可以在 中 AWS 管理主控台、透過 AWS CLI或使用 Amazon Cognito 使用者集區 API 建立和管理 SAML IdP。若要在 中建立您的第一個 SAML IdP AWS 管理主控台，請參閱 [在使用者集區中新增和管理 SAML 身分提供者](cognito-user-pools-managing-saml-idp.md)。

![\[使用 SAML 登入的身分驗證概觀\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/scenario-authentication-saml.png)


**注意**  
透過第三方 IdP 登入的聯合是 Amazon Cognito 使用者集區的一項功能。Amazon Cognito 身分集區，有時稱為 Amazon Cognito 聯合身分，是聯合的實作，您必須在每個身分集區中個別設定。使用者集區可以是身分集區的第三方 IdP。如需詳細資訊，請參閱[Amazon Cognito 身分集區](cognito-identity.md)。

## IdP 組態的快速參考
<a name="cognito-user-pools-saml-idp-reference"></a>

您必須設定 SAML IdP 以接受請求，並將回應傳送到您的使用者集區。SAML IdP 的文件將包含有關如何將使用者集區新增為 SAML 2.0 IdP 依賴方或應用程式的資訊。以下文件提供您必須為 SP 實體 ID 和聲明消費者服務 (ACS) URL 提供的值。使用者集區 SAML 值快速參考

**SP 實體 ID**  

```
urn:amazon:cognito:sp:us-east-1_EXAMPLE
```

**ACS URL**  

```
https://Your user pool domain/saml2/idpresponse
```

您必須設定使用者集區以支援您的身分提供者。新增外部 SAML IdP 的高階步驟如下所示。

1. 從 IdP 下載 SAML 中繼資料，或擷取中繼資料端點的 URL。請參閱 [設定您的第三方 SAML 身分提供者](cognito-user-pools-integrating-3rd-party-saml-providers.md)。

1. 將新的 IdP 新增至您的使用者集區。上傳 SAML 中繼資料或提供中繼資料 URL。請參閱 [在使用者集區中新增和管理 SAML 身分提供者](cognito-user-pools-managing-saml-idp.md)。

1. 將 IdP 指派給您的應用程式用戶端。請參閱 [使用應用程式用戶端的應用程式特定設定](user-pool-settings-client-apps.md)。

**Topics**
+ [IdP 組態的快速參考](#cognito-user-pools-saml-idp-reference)
+ [Amazon Cognito 使用者集區的 SAML IdP 相關須知](cognito-user-pools-saml-idp-things-to-know.md)
+ [SAML 使用者名稱區分大小寫](#saml-nameid-case-sensitivity)
+ [設定您的第三方 SAML 身分提供者](cognito-user-pools-integrating-3rd-party-saml-providers.md)
+ [在使用者集區中新增和管理 SAML 身分提供者](cognito-user-pools-managing-saml-idp.md)
+ [Amazon Cognito 使用者集區中的 SAML 工作階段啟動](cognito-user-pools-SAML-session-initiation.md)
+ [使用單一登出來登出 SAML 使用者](cognito-user-pools-saml-idp-sign-out.md)
+ [SAML 簽署和加密](cognito-user-pools-SAML-signing-encryption.md)
+ [SAML 身分提供者名稱和識別符](cognito-user-pools-managing-saml-idp-naming.md)

# Amazon Cognito 使用者集區的 SAML IdP 相關須知
<a name="cognito-user-pools-saml-idp-things-to-know"></a>

實作 SAML 2.0 IdP 隨附一些要求和限制。當您實作 IdP 時，請參閱本節。您還可以找到有助於在 SAML 與使用者集區聯合期間疑難排解錯誤的資訊。

**Amazon Cognito 會為您處理 SAML 聲明**  
Amazon Cognito 使用者集區支援與 POST 繫結端點進行 SAML 2.0 聯合。這樣您的應用程式就不需要擷取或剖析 SAML 聲明回應，因為使用者集區會透過使用者代理程式，直接從您的 IdP 收到 SAML 回應。使用者集區會代表您的應用程式做為服務供應商 (SP)。Amazon Cognito 支援 SP 啟動和 IdP 啟動的單一登入 (SSO)，如 [SAML V2.0 技術概觀](http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overview-2.0-cd-02.html)第 5.1.2 和 5.1.4 節所述。

**提供有效的 IdP 簽署憑證**  
當您在使用者集區中設定 SAML IdP 時，SAML 供應商中繼資料中的簽署憑證不得過期。

**使用者集區支援多個簽署憑證**  
當您的 SAML IdP 在 SAML 中繼資料中包含多個簽署憑證時，登入時，如果 SAML 宣告與 SAML 中繼資料中的任何憑證相符，則您的使用者集區會判斷 SAML 聲明有效。每個簽署憑證的長度不得超過 4，096 個字元。

**維護轉送狀態參數**  
Amazon Cognito 和您的 SAML IdP 會使用 `relayState` 參數維護工作階段資訊。  

1. Amazon Cognito 支援大於 80 個位元組的 `relayState` 值。雖然 SAML 規格指出 `relayState` 值「長度不得超過 80 個位元組」，但現今的業界經常不遵從此規範。而拒絕超過 80 個位元組的 `relayState` 值，將會破壞許多標準 SAML 供應商整合。

1. `relayState` 字符是 Amazon Cognito 維護之狀態資訊的不透明參考。Amazon Cognito 不會保證 `relayState` 參數的內容。請勿解析其內容，如此你的應用程式便會取決於結果。如需詳細資訊，請參閱 [SAML 2.0 規格](http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overview-2.0.html)。

**識別 ACS 端點**  
您的 SAML 身分提供者要求您設定宣告消費者端點。您的 IdP 會使用其 SAML 宣告將您的使用者重新導向至此端點。在 SAML 身分提供者中為 SAML 2.0 POST 繫結設定使用者集區網域中的下列端點。  

```
https://Your user pool domain/saml2/idpresponse
With an Amazon Cognito domain:
https://mydomain.auth.us-east-1.amazoncognito.com/saml2/idpresponse
With a custom domain:
https://auth.example.com/saml2/idpresponse
```
如需使用者集區網域的詳細資訊，請參閱 [設定使用者集區網域](cognito-user-pools-assign-domain.md)。

**沒有重播的聲明**  
您無法對 Amazon Cognito `saml2/idpresponse` 端點重複或重播 SAML 宣告。重播的 SAML 宣告具有重複先前 IdP 回應 ID 的宣告 ID。

**使用者集區 ID 是 SP 實體 ID**  
您必須在服務供應商 (SP) 中提供您的 IdP 使用者集區 ID`urn`，也稱為*對象 URI* 或 *SP 實體 ID*。您使用者集區的對象 URI 具有以下格式。  

```
urn:amazon:cognito:sp:us-east-1_EXAMPLE
```
您可以在 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)的使用者集區**概觀下找到您的使用者集區** ID。

**映射所有必要屬性**  
設定您的 SAML IdP，以為您在使用者集區中視需要設定的任何屬性提供值。例如，`email` 是使用者集區的常用必要屬性。在您的使用者可以登入之前，您的 SAML IdP 宣告必須包含您對應至 **使用者集區屬性** `email` 的宣告。如需屬性對應的詳細資訊，請參閱 [將 IdP 屬性映射至設定檔和字符](cognito-user-pools-specifying-attribute-mapping.md)。

**聲明格式有特定的要求**  
您的 SAML IdP 必須在 SAML 聲明中包含下列宣告。  
+ `NameID` 宣告。Amazon Cognito 會將 SAML 聲明與目的地使用者建立關聯`NameID`。如果`NameID`變更，Amazon Cognito 會將聲明視為新使用者的聲明。您在 IdP 組態`NameID`中設定為 的屬性必須具有持久性值。若要將 SAML 使用者指派給使用者集區中的一致使用者描述檔，請從具有未變更值的 屬性指派您的`NameID`宣告。

  ```
  <saml2:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:persistent">
    carlos
  </saml2:NameID>
  ```

  IdP `NameID`宣告`Format`中的 `urn:oasis:names:tc:SAML:1.1:nameid-format:persistent`表示您的 IdP 正在傳遞不變的值。Amazon Cognito 不需要此格式宣告，`urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified`如果您的 IdP 未指定`NameID`宣告的格式，則會指派 的格式。此行為符合 [SAML 2.0 規格的第 2.2.2](https://groups.oasis-open.org/higherlogic/ws/public/download/35711/sstc-saml-core-errata-2.0-wd-06-diff.pdf/latest) 節*複雜類型 NameIDType*。
+ 具有 `Audience` 值的 `AudienceRestriction` 宣告，會將您的使用者集區 SP 實體 ID 設定為回應的目標。

  ```
  <saml:AudienceRestriction>
    <saml:Audience> urn:amazon:cognito:sp:us-east-1_EXAMPLE
  </saml:AudienceRestriction>
  ```
+ 對於 SP 起始的單一登入，具有原始 SAML 請求 ID `InResponseTo`值的`Response`元素。

  ```
  <saml2p:Response Destination="https://mydomain.auth.us-east-1.amazoncognito.com/saml2/idpresponse" ID="id123" InResponseTo="_dd0a3436-bc64-4679-a0c2-cb4454f04184" IssueInstant="Date-time stamp" Version="2.0" xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  ```
**注意**  
IdP 起始的 SAML 聲明*不得*包含 `InResponseTo`值。
+ 具有使用者集區`saml2/idpresponse`端點`Recipient`值的 `SubjectConfirmationData`元素，對於 SP 起始的 SAML，則為符合原始 SAML 請求 ID `InResponseTo`的值。

  ```
  <saml2:SubjectConfirmationData InResponseTo="_dd0a3436-bc64-4679-a0c2-cb4454f04184" NotOnOrAfter="Date-time stamp" Recipient="https://mydomain.auth.us-east-1.amazoncognito.com/saml2/idpresponse"/>
  ```

**SP 啟動的登入請求**  
當 [授權端點](authorization-endpoint.md) 將使用者重新導向至您的 IdP 登入頁面，Amazon Cognito 會在 `HTTP GET` 請求的 URL 函數中包含 *SAML 請求*。SAML 請求包含使用者集區的相關資訊，包括您的 ACS 端點。您可以選擇性地將密碼編譯簽章套用至這些請求。

**簽署請求並加密回應**  
每個具有 SAML 提供者的使用者集區都會為 Amazon Cognito 指派給 SAML 請求的數位簽章產生非對稱金鑰對和*簽署憑證*。您設定為支援加密 SAML 回應的每個外部 SAML IdP 會導致 Amazon Cognito 為該提供者產生新的金鑰對和*加密憑證*。若要使用公有金鑰檢視和下載憑證，請在 Amazon Cognito 主控台的**社交和外部供應商**選單中選擇您的 IdP。  
若要建立對來自使用者集區的 SAML 請求的信任，請將使用者集區 SAML 2.0 簽署憑證的副本提供給 IdP。如果您未將 IdP 設定為接受已簽署的請求，IdP 可能會忽略您的使用者集區簽署的 SAML 請求。  

1. Amazon Cognito 會將數位簽章套用至您的使用者傳遞至 IdP 的 SAML 請求。您的使用者集區會簽署所有單一登出 (SLO) 請求，而且您可以將使用者集區設定為簽署任何 SAML 外部 IdP 的單一登入 (SSO) 請求。當您提供憑證的副本時，IdP 可以驗證使用者 SAML 請求的完整性。

1. 您的 SAML IdP 可以使用加密憑證加密 SAML 回應。當您使用 SAML 加密設定 IdP 時，您的 IdP 只能傳送加密的回應。

**編碼非英數字元**  
Amazon Cognito 不接受 4 位元組 UTF-8 字元𠮷，例如 😐 或您的 IdP 作為屬性值傳遞。您可以對字元進行 Base64 編碼，將其作為文字傳遞，然後在應用程式中將其解碼。  
在下列範例中，不會接受屬性宣告：  

```
<saml2:Attribute Name="Name" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">
  <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:string">😐</saml2:AttributeValue>
</saml2:Attribute>
```
與之前的範例相反，會接受以下屬性宣告：  

```
<saml2:Attribute Name="Name" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">
  <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:string">8J+YkA==</saml2:AttributeValue>
</saml2:Attribute>
```

**中繼資料端點必須具有有效的傳輸層安全性**  
如果您以 HTTPS 中繼資料端點 URL 來建立 SAML IdP 時，看到 `InvalidParameterException`，例如 "Error retrieving metadata from *<metadata endpoint>*"，請確定中繼資料端點已正確設定 SSL，並且有與其相關聯的有效 SSL 憑證。如需驗證憑證的詳細資訊，請參閱[什麼是 SSL/TLS 憑證？](https://aws.amazon.com/what-is/ssl-certificate/)。

**中繼資料端點必須位於 HTTP 或 HTTPS 的標準 TCP 連接埠上**  
Amazon Cognito 在 HTTP 的標準 TCP 連接埠 80 和 HTTPS 443 上只接受 SAML 供應商的中繼資料 URLs。作為安全最佳實務，在具有 `https://`字首的 TLS 加密 URL 上託管 SAML 中繼資料。輸入格式URLs*`https://www.example.com/saml2/metadata.xml`*。 *`http://www.example.com/saml2/metadata.xml`*Amazon Cognito 主控台僅接受字`https://`首為 URLs。您也可以使用 [CreateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateIdentityProvider.html) 和 [UpdateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateIdentityProvider.html) 設定 IdP 中繼資料。

**具有 IdP 起始 SAML 的應用程式用戶端只能使用 SAML 登入**  
當您啟用支援應用程式用戶端 IdP IdP的 SAML 2.0 IdP 支援時，您只能將其他 SAML 2.0 IdPs新增至該應用程式用戶端。您無法將使用者集區中的使用者目錄*和*所有非 SAML 外部身分提供者新增至以這種方式設定的應用程式用戶端。

**登出回應必須使用 POST 繫結**  
`/saml2/logout` 端點接受 `LogoutResponse`做為`HTTP POST`請求。使用者集區不接受具有`HTTP GET`繫結的登出回應。

**中繼資料簽署憑證輪換**  
當您使用 URL 提供中繼資料時，Amazon Cognito 會快取 SAML 中繼資料長達六個小時。執行任何中繼資料簽署憑證輪換時，請將中繼資料來源設定為*發佈*原始憑證和新憑證至少六小時。當 Amazon Cognito 從中繼資料 URL 重新整理快取時，它會將每個憑證視為有效，而且您的 SAML IdP 可以使用新憑證開始簽署 SAML 聲明。在此期間過後，您可以從已發佈的中繼資料中移除原始憑證。

## SAML 使用者名稱區分大小寫
<a name="saml-nameid-case-sensitivity"></a>

當聯合身分使用者嘗試登入時，SAML 身分提供者 (IdP) 會在使用者的 SAML 聲明中將唯一的 傳遞`NameId`給 Amazon Cognito。Amazon Cognito 會依 `NameId` 宣告識別 SAML 聯合身分使用者。無論您的使用者集區的區分大小寫設定為何，Amazon Cognito 都會在傳遞其唯一且區分大小寫的`NameId`宣告時，從 SAML IdP 辨識傳回的聯合身分使用者。如果您將一個類似 `email` 的屬性對應至 `NameId`，且您的使用者變更其電子郵件地址，則他們無法登入到您的應用程式。

從 IdP 屬性對應您 SAML 聲明中的 `NameId`，其具有不會變更的值。

例如，Carlos 在您不區分大小寫的使用者集區中，有一個來自 Active Directory Federation Services (ADFS) SAML 聲明的使用者描述檔，該聲明將 `Carlos@example.com` 作為 `NameId` 值傳遞。下次 Carlos 嘗試登入時，您的 ADFS IdP 將 `carlos@example.com` 作為 `NameId` 值傳遞。由於 `NameId` 必須是大小寫完全符合，因此登入不會成功。

如果您的使用者在其 `NameID` 變更後無法登入，請將其使用者描述檔從您的使用者集區中刪除。下次該使用者登入時，Amazon Cognito 會建立新的使用者描述檔。

**Topics**
+ [IdP 組態的快速參考](#cognito-user-pools-saml-idp-reference)
+ [Amazon Cognito 使用者集區的 SAML IdP 相關須知](cognito-user-pools-saml-idp-things-to-know.md)
+ [SAML 使用者名稱區分大小寫](#saml-nameid-case-sensitivity)
+ [設定您的第三方 SAML 身分提供者](cognito-user-pools-integrating-3rd-party-saml-providers.md)
+ [在使用者集區中新增和管理 SAML 身分提供者](cognito-user-pools-managing-saml-idp.md)
+ [Amazon Cognito 使用者集區中的 SAML 工作階段啟動](cognito-user-pools-SAML-session-initiation.md)
+ [使用單一登出來登出 SAML 使用者](cognito-user-pools-saml-idp-sign-out.md)
+ [SAML 簽署和加密](cognito-user-pools-SAML-signing-encryption.md)
+ [SAML 身分提供者名稱和識別符](cognito-user-pools-managing-saml-idp-naming.md)

# 設定您的第三方 SAML 身分提供者
<a name="cognito-user-pools-integrating-3rd-party-saml-providers"></a>

當您想要將 SAML 身分提供者 (IdP) 新增至使用者集區時，您必須在 IdP 的管理界面中進行一些組態更新。本節說明如何格式化您必須提供給 IdP 的值。您也可以了解如何擷取靜態或作用中 URL 中繼資料文件，以識別 IdP 及其對使用者集區的 SAML 宣告。

若要設定第三方 SAML 2.0 身分提供者 (IdP) 解決方案以使用 Amazon Cognito 使用者集區的聯合，您必須設定 SAML IdP 以重新導向至下列聲明消費者服務 (ACS) URL：`https://mydomain.auth.us-east-1.amazoncognito.com/saml2/idpresponse`。如果您的使用者集區具有 Amazon Cognito 網域，您可以在 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)的使用者集區的**網域**選單中找到您的使用者集區網域路徑。

有些 SAML IdPs 要求您提供 `urn`，也稱為對象 URI 或 SP 實體 ID，格式為 `urn:amazon:cognito:sp:us-east-1_EXAMPLE`。您可以在 Amazon Cognito 主控台的使用者集區**概觀下找到您的使用者集區** ID。

您還必須設定 SAML IdP，以為使用者集區中指定為*必要*屬性的任何屬性提供值。一般而言， `email`是使用者集區的必要屬性，在這種情況下，SAML IdP 必須在其 SAML 聲明中提供某種形式的`email`宣告，而且您必須將宣告對應至該提供者的屬性。

下列第三方 SAML 2.0 IdP 解決方案的組態資訊是開始使用 Amazon Cognito 使用者集區設定聯合的最佳位置。如需最新資訊，請直接參閱供應商的文件。

若要簽署 SAML 請求，您必須設定 IdP 以信任由使用者集區簽署憑證簽署的請求。若要接受加密的 SAML 回應，您必須設定 IdP 來加密對使用者集區*的所有* SAML 回應。您的提供者將擁有設定這些功能的文件。如需 Microsoft 的範例，請參閱[設定 Microsoft Entra SAML 字符加密](https://learn.microsoft.com/en-us/entra/identity/enterprise-apps/howto-saml-token-encryption)。

**注意**  
Amazon Cognito 只需要您的身分提供者中繼資料文件。您的提供者也可能提供 SAML 2.0 與 IAM 或 聯合的自訂組態資訊 AWS IAM Identity Center。若要了解如何設定 Amazon Cognito 整合，請尋找擷取中繼資料文件的一般指示，並管理使用者集區中的其餘組態。


| 解決方案 | 其他資訊 | 
| --- | --- | 
| Microsoft Entra ID | [聯合中繼資料](https://learn.microsoft.com/en-us/entra/identity-platform/federation-metadata) | 
| Okta | [如何下載 SAML 應用程式整合的 IdP 中繼資料和 SAML 簽署憑證](https://support.okta.com/help/s/article/Location-to-download-Okta-IDP-XML-metadata-for-a-SAML-app-in-the-new-Admin-User-Interface) | 
| Auth0 | [將 Auth0 設定為 SAML 身分提供者](https://auth0.com/docs/authenticate/protocols/saml/saml-sso-integrations/configure-auth0-saml-identity-provider) | 
| Ping Identity (PingFederate) | [從 PingFederate 匯出 SAML 中繼資料](https://docs.pingidentity.com/integrations/contentful/configuring_single_sign-on/pf_contentful_integration_exporting_saml_metadata_from_pf.html) | 
| JumpCloud | [SAML 組態備註](https://jumpcloud.com/support/saml-configuration-notes) | 
| SecureAuth | [SAML 應用程式整合](https://docs.secureauth.com/2104/en/saml-application-integration.html) | 

# 在使用者集區中新增和管理 SAML 身分提供者
<a name="cognito-user-pools-managing-saml-idp"></a>

將身分提供者設定為使用 Amazon Cognito 之後，您可以將其新增至使用者集區和應用程式用戶端。下列程序示範如何在 Amazon Cognito 使用者集區中建立、修改和刪除 SAML 供應商。

------
#### [ AWS 管理主控台 ]

您可以使用 AWS 管理主控台 來建立和刪除 SAML 身分提供者 IdPs)。

建立 SAML IdP 之前，您必須擁有從第三方 IdP 取得的 SAML 中繼資料文件。如需有關如何取得或產生所需之 SAML 中繼資料文件的詳細資訊，請參閱 [設定您的第三方 SAML 身分提供者](cognito-user-pools-integrating-3rd-party-saml-providers.md)。

**在您的使用者集區中設定 SAML 2.0 IdP**

1. 前往 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)。若出現提示，請輸入 AWS 憑證。

1. 選擇 **User Pools** (使用者集區)。

1. 從清單中選擇現有的使用者集區，或[建立使用者集區](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)。

1. 選擇**社交和外部提供者**選單，然後選取**新增身分提供者**。

1. 選擇 **SAML** IdP。

1. 輸入**供應商名稱**。您可以在 `identity_provider` 請求參數中將此易記的名稱傳遞給 [授權端點](authorization-endpoint.md)。

1. 輸入以逗號分隔的 **Identifiers** (識別符)。識別符通知 Amazon Cognito，應該檢查使用者在登入時輸入的電子郵件地址，然後將其導向至與其網域對應的供應商。

1. 如果您希望 Amazon Cognito 在使用者登出時傳送已簽署的登出請求給您的供應商，則請選擇 **Add sign-out flow** (新增登出流程)。您必須設定 SAML 2.0 IdP，將登出回應傳送至設定受管登入時建立的`https://mydomain.auth.us-east-1.amazoncognito.com/saml2/logout`端點。`saml2/logout` 端點會使用 POST 繫結。
**注意**  
如果選取此選項，且您的 SAML IdP 預期有簽署的登出請求，您還必須將使用者集區的簽署憑證提供給 SAML IdP。  
SAML IdP 將處理簽署登出請求，以及將您的使用者從 Amazon Cognito 工作階段登出。

1. 選擇您的 **IdP 起始 SAML 登入**組態。作為安全最佳實務，請選擇**僅接受 SP 起始的 SAML 聲明**。如果您已準備好讓環境安全地接受未經請求的 SAML 登入工作階段，請選擇**接受 SP 起始和 IdP 起始的 SAML 聲明**。如需詳細資訊，請參閱[Amazon Cognito 使用者集區中的 SAML 工作階段啟動](cognito-user-pools-SAML-session-initiation.md)。

1. 選擇 **Metadata document source** (中繼資料文件來源)。如果您的 IdP 以公有 URL 提供 SAML 中繼資料，則可以選擇 **Metadata document URL** (中繼資料文件 URL)，然後輸入該公有 URL。否則，請選擇 **Upload metadata document** (上傳中繼資料文件)，然後選取您先前從供應商處下載的中繼資料檔案。
**注意**  
如果您的提供者有公有端點，而不是上傳檔案，我們建議您輸入中繼資料文件 URL。Amazon Cognito 會自動從中繼資料 URL 重新整理中繼資料。通常每 6 小時或是在中繼資料過期之前 (取較早的時間) 重新整理中繼資料。

1. **在 SAML 提供者和使用者集區之間映射屬性**，將 SAML 提供者屬性映射至使用者集區中的使用者設定檔。在屬性對應中包含您的使用者集區必要屬性。

   例如，當您選擇 **User pool attribute** (使用者集區屬性) `email` 時，隨著 IdP SAML 聲明中顯示的 SAML 屬性名稱輸入 SAML 屬性名稱。如果 IdP 提供 SAML 聲明範例，則您可以使用這些聲明範例協助您找到名稱。有些 IdPs 使用簡單的名稱，例如 `email`，有些則使用如下的名稱。

   ```
   http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress
   ```

1. 選擇**建立**。

------
#### [ API/CLI ]

您可以使用下列命令來建立及管理 SAML 身分提供者 (IdP)。

**建立 IdP 並上傳中繼資料文件**
+ AWS CLI: `aws cognito-idp create-identity-provider`

  使用中繼資料檔案的範例：`aws cognito-idp create-identity-provider --user-pool-id us-east-1_EXAMPLE --provider-name=SAML_provider_1 --provider-type SAML --provider-details file:///details.json --attribute-mapping email=http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress`

  其中 `details.json` 包含：

  ```
  "ProviderDetails": { 
        "MetadataFile": "<SAML metadata XML>",
        "IDPSignout" : "true",
        "RequestSigningAlgorithm" : "rsa-sha256",
        "EncryptedResponses" : "true",
        "IDPInit" : "true"
  }
  ```
**注意**  
如果 *<SAML 中繼資料 XML>* 包含字元 的任何執行個體`"`，您必須新增 `\`做為逸出字元：`\"`。

  使用中繼資料 URL 的範例：`aws cognito-idp create-identity-provider --user-pool-id us-east-1_EXAMPLE --provider-name=SAML_provider_1 --provider-type SAML --provider-details MetadataURL=https://myidp.example.com/sso/saml/metadata --attribute-mapping email=http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress`
+ AWS API：[CreateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateIdentityProvider.html)

**為 IdP 上傳新的中繼資料文件**
+ AWS CLI: `aws cognito-idp update-identity-provider`

  使用中繼資料檔案的範例：`aws cognito-idp update-identity-provider --user-pool-id us-east-1_EXAMPLE --provider-name=SAML_provider_1 --provider-details file:///details.json --attribute-mapping email=http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress`

  其中 `details.json` 包含：

  ```
  "ProviderDetails": { 
        "MetadataFile": "<SAML metadata XML>",
        "IDPSignout" : "true",
        "RequestSigningAlgorithm" : "rsa-sha256",
        "EncryptedResponses" : "true",
        "IDPInit" : "true"
  }
  ```
**注意**  
如果 *<SAML 中繼資料 XML>* 包含字元 的任何執行個體`"`，您必須新增 `\`做為逸出字元：`\"`。

  使用中繼資料 URL 的範例：`aws cognito-idp update-identity-provider --user-pool-id us-east-1_EXAMPLE --provider-name=SAML_provider_1 --provider-details MetadataURL=https://myidp.example.com/sso/saml/metadata --attribute-mapping email=http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress`
+ AWS API：[UpdateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateIdentityProvider.html)

**取得特定 IdP 的相關資訊**
+ AWS CLI: `aws cognito-idp describe-identity-provider`

  `aws cognito-idp describe-identity-provider --user-pool-id us-east-1_EXAMPLE --provider-name=SAML_provider_1`
+ AWS API：[DescribeIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DescribeIdentityProvider.html)

**列出所有 IdP 的相關資訊**
+ AWS CLI: `aws cognito-idp list-identity-providers`

  範例：`aws cognito-idp list-identity-providers --user-pool-id us-east-1_EXAMPLE --max-results 3`
+ AWS API：[ListIdentityProviders](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListIdentityProviders.html)

**刪除 IdP**
+ AWS CLI: `aws cognito-idp delete-identity-provider`

  `aws cognito-idp delete-identity-provider --user-pool-id us-east-1_EXAMPLE --provider-name=SAML_provider_1`
+ AWS API：[DeleteIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DeleteIdentityProvider.html)

------

**設定 SAML IdP 以新增使用者集區做為依賴方**
+ 使用者集區服務供應商 URN 為：`urn:amazon:cognito:sp:us-east-1_EXAMPLE`。Amazon Cognito 需要符合 SAML 回應中此 URN 的對象限制值。將 IdP 設定為針對 IdP-to-SP 回應訊息使用下列 POST 繫結端點。

  ```
  https://mydomain.auth.us-east-1.amazoncognito.com/saml2/idpresponse
  ```
+ 您的 SAML IdP 必須在 SAML 聲明中填入 `NameID`和使用者集區的任何必要屬性。 `NameID` 用於唯一識別使用者集區中的 SAML 聯合身分使用者。您的 IdP 必須以一致且區分大小寫的格式傳遞每個使用者的 SAML 名稱 ID。使用者名稱 ID 值的任何變化都會建立新的使用者設定檔。

**如要對您的 SAML 2.0 IDP 提供簽署憑證**
+ 若要從 Amazon Cognito 下載公有金鑰的副本，您的 IdP 可用來驗證 SAML 登出請求，請選擇使用者集區的**社交和外部供應商**選單，選取您的 IdP，然後在**檢視簽署憑證**下，選取**下載為 .crt**。

您可以使用 Amazon Cognito 主控台刪除在使用者集區中設定的任何 SAML 供應商。

**刪除 SAML 供應商**

1. 登入 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)。

1. 在導覽窗格中，選擇 **User Pools** (使用者集區)，然後選擇您要編輯的使用者集區。

1. 選擇**社交和外部供應商**選單。

1. 在您要刪除的 SAML IdP 旁邊，選取選項按鈕。

1. 出現 **Delete identity provider** (刪除身分提供者) 的提示時，請輸入 SAML 供應商的名稱以確認刪除，然後選擇 **Delete** (刪除)。

# Amazon Cognito 使用者集區中的 SAML 工作階段啟動
<a name="cognito-user-pools-SAML-session-initiation"></a>

Amazon Cognito 支援服務供應商啟動 (SP 啟動） 的單一登入 (SSO) 和 IdP 啟動的 SSO。作為最佳安全實務，請在使用者集區中實作 SP 起始的 SSO。[SAML V2.0 技術概觀](http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overview-2.0-cd-02.html#5.1.2.SP-Initiated%20SSO:%20%20Redirect/POST%20Bindings|outline)的第 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)。

**Topics**
+ [實作 SP 初始化的 SAML 登入](#cognito-user-pools-saml-idp-authentication)
+ [實作 IdP 起始的 SAML 登入](#cognito-user-pools-SAML-session-initiation-idp-initiation)

## 實作 SP 初始化的 SAML 登入
<a name="cognito-user-pools-saml-idp-authentication"></a>

最佳實務是實作使用者集區的service-provider-initiated(SP 起始） 登入。Amazon Cognito 會啟動使用者的工作階段，並將其重新導向至您的 IdP。使用此方法，您可以對誰提出登入請求擁有最大的控制權。您也可以在特定情況下允許 IdP 起始的登入。

下列程序顯示使用者如何透過 SAML 供應商完成由 SP 起始的使用者集區登入。

![\[Amazon Cognito SP 起始 SAML 登入的身分驗證流程圖。\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/scenario-authentication-saml-stepbystep.png)


1. 您的使用者在登入頁面輸入其電子郵件地址。若要判斷使用者重新導向至其 IdP，您可以在自訂建置應用程式中收集其電子郵件地址，或在 Web 檢視中叫用受管登入。

   您可以設定受管登入頁面以顯示 IdPs 清單，或提示輸入電子郵件地址，並將其與 SAML IdP 的識別符相符。若要提示輸入電子郵件地址，請在 **Foundation** 中編輯您的受管登入品牌樣式，找到**身分驗證行為**，然後在**提供者顯示**下，將**顯示樣式**設定為**網域搜尋輸入**。

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

1. Amazon Cognito 會使用 SAML 請求，[選擇性地](cognito-user-pools-SAML-signing-encryption.md#cognito-user-pools-SAML-signing.title)在 `AuthnRequest`元素中將您的使用者重新導向至 IdP。

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

1. IdP 會使用 POST 承載中的[選擇性加密](cognito-user-pools-SAML-signing-encryption.md#cognito-user-pools-SAML-signing-encryption.title) SAML 聲明，將使用者重新導向至您的使用者集區 SAML 回應端點。
**注意**  
Amazon Cognito 會在 5 分鐘內取消未收到回應的工作階段，並將使用者重新導向至受管登入。當您的使用者遇到此結果時，會收到`Something went wrong`錯誤訊息。

1. 在驗證 SAML 聲明並從回應中的宣告[映射使用者屬性](cognito-user-pools-specifying-attribute-mapping.md#cognito-user-pools-specifying-attribute-mapping.title)之後，Amazon Cognito 會在內部建立或更新使用者集區中的使用者設定檔。一般而言，您的使用者集區會將授權碼傳回至使用者的瀏覽器工作階段。

1. 您的使用者會向應用程式顯示其授權碼，以交換 JSON Web 字符 (JWTs的程式碼。

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

當使用者驗證並接收授權碼授予時，使用者集區會傳回 ID、存取和重新整理權杖。ID 字符是 OIDC 型身分管理的身分驗證物件。存取權杖是具有 [OAuth 2.0 ](https://oauth.net/2/)範圍的授權物件。重新整理權杖是在使用者目前的權杖過期時產生新 ID 和存取權杖的物件。您可以在使用者集區應用程式用戶端中設定使用者字符的持續時間。

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

## 實作 IdP 起始的 SAML 登入
<a name="cognito-user-pools-SAML-session-initiation-idp-initiation"></a>

當您為 IdP 起始的 SAML 2.0 登入設定身分提供者時，您可以將 SAML 聲明呈現給使用者集區網域中的`saml2/idpresponse`端點，而不需要在 啟動工作階段[授權端點](authorization-endpoint.md)。具有此組態的使用者集區接受來自所請求應用程式用戶端所支援之使用者集區外部身分提供者的 IdP 起始 SAML 聲明。

![\[Amazon Cognito IdP 起始 SAML 登入的身分驗證流程圖。\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/scenario-authentication-saml-idpinit.png)


1. 使用者使用您的應用程式請求 SAML 登入。

1. 您的應用程式會叫用瀏覽器，或將使用者重新導向至其 SAML 供應商的登入頁面。

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

1. IdP 會使用其 POST 內文中的 SAML 聲明或回應，將使用者重新導向到您的應用程式。

1. 您的應用程式會將 SAML 聲明新增至使用者集區`saml2/idpresponse`端點請求的 POST 內文。

1. Amazon Cognito 會向您的使用者發出授權碼。

1. 您的使用者會向應用程式顯示其授權碼，以交換 JSON Web 字符 (JWTs的程式碼。

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

下列步驟說明使用 IdP 起始的 SAML 2.0 供應商設定和登入的整體程序。

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

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

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

1. 將 IdP 起始的 SAML 供應商與使用者集區中的應用程式用戶端建立關聯。

1. 引導您的使用者前往 SAML IdP 的登入頁面，並擷取 SAML 聲明。

1. 使用您的使用者 SAML 聲明將使用者導向您的使用者集區`saml2/idpresponse`端點。

1. 接收 JSON Web 字符 JWTs)。

若要在使用者集區中接受未經請求的 SAML 聲明，您必須考慮其對應用程式安全性的影響。當您接受 IdP 起始的請求時，可能會進行請求詐騙和 CSRF 嘗試。雖然您的使用者集區無法驗證 IdP 起始的登入工作階段，但 Amazon Cognito 會驗證您的請求參數和 SAML 聲明。

此外，您的 SAML 聲明不得包含`InResponseTo`宣告，且必須在前 6 分鐘內發出。

您必須使用 IdP 起始的 SAML 將請求提交到您的 `/saml2/idpresponse`。對於 SP 起始和受管的登入授權請求，您必須提供參數，以將請求的應用程式用戶端、範圍、重新導向 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 管理主控台 ]

**為 IdP 起始的 SAML 設定 IdP**

1. 建立[使用者集區](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)、[應用程式用戶端](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-configuring-app-integration.html)和 SAML 身分提供者。

1. 如有關聯，請將所有社交和 OIDC 身分提供者與您的應用程式用戶端取消關聯。

1. 導覽至使用者集區的**社交和外部供應商**選單。

1. 編輯或新增 SAML 供應商。

1. 在 **IdP 起始的 SAML 登入**下，選擇**接受 SP 起始和 IdP 起始的 SAML 聲明**。

1. 選擇**儲存變更**。

------
#### [ API/CLI ]

**為 IdP 起始的 SAML 設定 IdP**

使用 [CreateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateIdentityProvider.html) 或 [UpdateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateIdentityProvider.html) API 請求中的 `IDPInit` 參數設定 IdP 起始的 SAML。以下是支援 `ProviderDetails` IdP 起始 SAML 的 IdP 範例。

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

------

# 使用單一登出來登出 SAML 使用者
<a name="cognito-user-pools-saml-idp-sign-out"></a>

Amazon Cognito 支援 SAML 2.0 [單一登出 ](http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overview-2.0-cd-02.html#5.3.Single%20Logout%20Profile|outline)(SLO。 透過 SLO，您的應用程式可以在使用者從使用者集區登出時，從其 SAML 身分提供者 (IdPs) 登出使用者。如此一來，當使用者想要再次登入您的應用程式時，他們必須使用其 SAML IdP 進行身分驗證。否則，他們可能已備妥 IdP 或使用者集區瀏覽器 Cookie，這些 Cookie 會傳遞到您的應用程式，而不需要他們提供登入資料。

當您將 SAML IdP 設定為支援**登出流程**時，Amazon Cognito 會使用已簽署的 SAML 登出請求將使用者重新導向至 IdP。Amazon Cognito 會從 IdP 中繼資料中的 `SingleLogoutService` URL 判斷重新導向位置。Amazon Cognito 使用您的使用者集區簽署憑證來簽署登出請求。

![\[Amazon Cognito SAML 登出的身分驗證流程圖。使用者請求登出，Amazon Cognito 會使用 SAML 登出請求將其重新導向至其提供者。\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/scenario-authentication-saml-sign-out.png)


當您將具有 SAML 工作階段的使用者導向您的使用者集區`/logout`端點時，Amazon Cognito 會使用下列請求將 SAML 使用者重新導向至 IdP 中繼資料中指定的 SLO 端點。

```
https://[SingleLogoutService endpoint]?
SAMLRequest=[encoded SAML request]&
RelayState=[RelayState]&
SigAlg=http://www.w3.org/2001/04/xmldsig-more#rsa-sha256&
Signature=[User pool RSA signature]
```

您的使用者接著`LogoutResponse`會從其 IdP 使用 返回您的`saml2/logout`端點。您的 IdP 必須在 `HTTP POST`請求`LogoutResponse`中傳送 。然後，Amazon Cognito 會從其初始登出請求將其重新導向至重新導向目的地。

您的 SAML 提供者可能會傳送`AuthnStatement`一個`LogoutResponse`以上的 。此類型的回應`AuthnStatement`中第一個 `sessionIndex`中的 必須符合最初驗證使用者的 SAML 回應`sessionIndex`中的 。如果 `sessionIndex` 位於任何其他 中`AuthnStatement`，Amazon Cognito 將無法辨識工作階段，也不會將您的使用者登出。

------
#### [ AWS 管理主控台 ]

**設定 SAML 登出**

1. 建立[使用者集區](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)、[應用程式用戶端](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-configuring-app-integration.html)和 SAML IdP。

1. 當您建立或編輯 SAML 身分提供者時，請在**身分提供者資訊**下，勾選標題為**新增登出流程**的方塊。

1. 從使用者集區的**社交和外部供應商**選單中，選擇您的 IdP 並找到**簽署憑證**。

1. 選擇**下載為 .crt**。

1. 將 SAML 提供者設定為支援 SAML 單一登出和請求簽署，並上傳使用者集區簽署憑證。您的 IdP 必須重新導向至使用者集區網域`/saml2/logout`中的 。

------
#### [ API/CLI ]

**設定 SAML 登出**

使用 [CreateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateIdentityProvider.html) 或 [UpdateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateIdentityProvider.html) API 請求的 `IDPSignout` 參數設定單一登出。以下是支援 SAML 單一登出`ProviderDetails`的 IdP 範例。

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

------

# SAML 簽署和加密
<a name="cognito-user-pools-SAML-signing-encryption"></a>

SAML 2.0 登入是以應用程式的使用者為基礎建置，作為其身分驗證流程中請求和回應的承載。您可能想要確保使用者不會在傳輸中讀取或修改這些 SAML 文件。若要達成此目的，請將 SAML 簽署和加密新增至使用者集區中的 SAML 身分提供者 IdPs)。透過 SAML 簽署，您的使用者集區會將簽章新增至 SAML 登入和登出請求。使用您的使用者集區公有金鑰，IdP 可以驗證其是否正在接收未修改的 SAML 請求。然後，當您的 IdP 回應並將 SAML 聲明傳遞給使用者的瀏覽器工作階段時，IdP 可以加密該回應，讓使用者無法檢查自己的屬性和權利。

透過 SAML 簽署和加密，使用者集區 SAML 操作期間的所有密碼編譯操作都必須使用 user-pool-provided金鑰產生簽章和加密文字。 Amazon Cognito 目前，您無法將使用者集區設定為使用外部金鑰簽署請求或接受加密聲明。

**注意**  
您的使用者集區憑證有效期為 10 年。每年一次，Amazon Cognito 會為您的使用者集區產生新的簽署和加密憑證。當您請求簽署憑證時，Amazon Cognito 會傳回最新的憑證，並使用最新的簽署憑證簽署請求。您的 IdP 可以使用任何未過期的使用者集區加密憑證來加密 SAML 聲明。您先前的憑證在整個期間內持續有效，而且憑證之間的公有金鑰不會變更。最佳實務是每年更新供應商組態中的憑證。

**Topics**
+ [從 IdP 接受加密的 SAML 回應](#cognito-user-pools-SAML-encryption)
+ [簽署 SAML 請求](#cognito-user-pools-SAML-signing)

## 從 IdP 接受加密的 SAML 回應
<a name="cognito-user-pools-SAML-encryption"></a>

當使用者登入和登出時，Amazon Cognito 和您的 IdP 可以在 SAML 回應中建立機密性。Amazon Cognito 會將公有/私有 RSA 金鑰對和憑證指派給您在使用者集區中設定的每個外部 SAML 提供者。當您為使用者集區 SAML 供應商啟用回應加密時，您必須將憑證上傳至支援加密 SAML 回應的 IdP。在 IdP 開始使用提供的金鑰加密所有 SAML 聲明之前，您的 SAML IdP 使用者集區連線無法運作。

以下是加密 SAML 登入流程的概觀。

1. 您的使用者開始登入並選擇其 SAML IdP。

1. 您的使用者集區會使用 SAML 登入請求，將使用者[授權端點](authorization-endpoint.md)重新導向至其 SAML IdP。您的使用者集區可以選擇性地伴隨此請求與啟用 IdP 完整性驗證的簽章。當您想要簽署 SAML 請求時，您必須設定 IdP 以接受您的使用者集區已使用簽署憑證中的公有金鑰簽署的請求。

1. SAML IdP 會在您的使用者中登入並產生 SAML 回應。IdP 會使用公有金鑰加密回應，並將您的使用者重新導向至您的使用者集區`/saml2/idpresponse`端點。IdP 必須加密 SAML 2.0 規格定義的回應。如需詳細資訊，請參閱 `Element <EncryptedAssertion>` [OASIS 安全性聲明標記語言 (SAML) V2.0 的聲明和通訊協定。](https://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf)

1. 您的使用者集區會使用私有金鑰解密 SAML 回應中的加密文字，並登入您的使用者。

**重要**  
當您在使用者集區中啟用 SAML IdP 的回應加密時，IdP 必須使用提供者特定的公有金鑰來加密所有回應。Amazon Cognito 不接受來自您設定為支援加密之 SAML 外部 IdP 的未加密 SAML 回應。

使用者集區中的任何外部 SAML IdP 都可以支援回應加密，而且每個 IdP 都會收到自己的金鑰對。

------
#### [ AWS 管理主控台 ]

**設定 SAML 回應加密**

1. 建立[使用者集區](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)、[應用程式用戶端](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-configuring-app-integration.html)和 SAML IdP。

1. 當您建立或編輯 SAML 身分提供者時，請在**簽署請求和加密回應**下，勾選標題**為需要此提供者加密 SAML 聲明**的核取方塊。

1. 從使用者集區的**社交和外部提供者**功能表中，選取您的 SAML IdP，然後選擇**檢視加密憑證**。

1. 選擇**下載為 .crt**，並將下載的檔案提供給 SAML IdP。設定 SAML IdP 以使用憑證中的 金鑰加密 SAML 回應。

------
#### [ API/CLI ]

**設定 SAML 回應加密**

使用 [CreateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateIdentityProvider.html) 或 [UpdateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateIdentityProvider.html) API 請求的 `EncryptedResponses` 參數設定回應加密。以下是支援請求簽署`ProviderDetails`的 IdP 範例。

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

若要從您的使用者集區取得加密憑證，請提出 [DescribeIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DescribeIdentityProvider.html) API 請求，並在回應參數 `ActiveEncryptionCertificate`中擷取 的值`ProviderDetails`。儲存此憑證，並將其做為來自使用者集區的登入請求的加密憑證提供給 IdP。

------

## 簽署 SAML 請求
<a name="cognito-user-pools-SAML-signing"></a>

向 IdP 證明 SAML 2.0 請求完整性的能力是 Amazon Cognito SP 起始 SAML 登入的安全性優勢。每個具有網域的使用者集區都會收到使用者集區 X.509 簽署憑證。透過此憑證中的公有金鑰，使用者集區會將密碼編譯簽章套用至使用者集區在使用者選取 SAML IdP 時產生的*登出請求*。您可以選擇性地設定應用程式用戶端來簽署 SAML *登入請求*。當您簽署 SAML 請求時，IdP 可以檢查請求的 XML 中繼資料中的簽章是否符合您提供的使用者集區憑證中的公有金鑰。

------
#### [ AWS 管理主控台 ]

**設定 SAML 請求簽署**

1. 建立[使用者集區](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)、[應用程式用戶端](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-configuring-app-integration.html)和 SAML IdP。

1. 當您建立或編輯 SAML 身分提供者時，請在**簽署請求和加密回應**下，勾選標題為**簽署 SAML 請求給此提供者**的核取方塊。

1. 從使用者集區的**社交和外部提供者**功能表中，選擇**檢視簽署憑證**。

1. 選擇**下載為 .crt**，並將下載的檔案提供給 SAML IdP。設定 SAML IdP 以驗證傳入 SAML 請求的簽章。

------
#### [ API/CLI ]

**設定 SAML 請求簽署**

使用 [CreateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateIdentityProvider.html) 或 [UpdateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateIdentityProvider.html) API 請求的 `RequestSigningAlgorithm` 參數設定請求簽署。以下是支援請求簽署`ProviderDetails`的 IdP 範例。

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

------

# SAML 身分提供者名稱和識別符
<a name="cognito-user-pools-managing-saml-idp-naming"></a>

當您命名 SAML 身分提供者 (IdPs) 並指派 IdP 識別符時，您可以自動化向該提供者發出的 SP 起始登入和登出請求流程。如需提供者名稱字串限制的相關資訊，請參閱 [CreateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateIdentityProvider.html#CognitoUserPools-CreateIdentityProvider-request-ProviderName) 的 `ProviderName` 屬性。

![\[具有 IdP 識別符和受管登入的 Amazon Cognito SP 起始 SAML 登入的身分驗證流程圖。使用者提供電子郵件地址給受管登入，Amazon Cognito 會自動將其重新導向至其供應商。\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/scenario-authentication-saml-identifier.png)


您也可以為 SAML 供應商選擇最多 50 個識別符。識別符是使用者集區中 IdP 的易記名稱，而且在使用者集區中必須是唯一的。如果您的 SAML 識別符符合使用者的電子郵件網域，受管登入會請求每個使用者的電子郵件地址、評估其電子郵件地址中的網域，並將他們重新導向至與其網域對應的 IdP。由於同一個組織可以擁有多個網域，因此單一 IdP 可以有多個識別符。

無論您是否使用電子郵件網域識別符，都可以在多租戶應用程式中使用識別符，將使用者重新導向至正確的 IdP。當您想要完全略過受管登入時，您可以自訂呈現給使用者的連結，讓他們[授權端點](authorization-endpoint.md)直接透過 重新導向至其 IdP。若要使用識別符登入您的使用者並重新導向至其 IdP，請在其初始授權請求的請求參數`idp_identifier=myidp.example.com`中包含 格式的識別符。

將使用者傳遞至 IdP 的另一個方法是使用下列 URL 格式的 IdP `identity_provider`名稱填入 參數。

```
https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/authorize?
response_type=code&
identity_provider=MySAMLIdP&
client_id=1example23456789&
redirect_uri=https://www.example.com
```

使用者使用 SAML IdP 登入後，IdP 會使用`HTTP POST`內文中的 SAML 回應將使用者重新導向至`/saml2/idpresponse`端點。Amazon Cognito 會處理 SAML 聲明，如果回應中的宣告符合預期，則會重新導向至您的應用程式用戶端回呼 URL。您的使用者以此方式完成身分驗證後，他們只會與 IdP 和應用程式的網頁互動。

使用網域格式的 IdP 識別符，受管登入會在登入時請求電子郵件地址，然後在電子郵件網域符合 IdP 識別符時，將使用者重新導向至其 IdP 的登入頁面。例如，您建置的應用程式需要兩個不同公司的員工登入。第一家公司，AnyCompany A，擁有 `exampleA.com` 和 `exampleA.co.uk`。第二家公司，AnyCompany B，擁有 `exampleB.com`。在此範例中，您已設定了兩個 IdP，每家公司各一個，如下所示：
+ 針對 IdP A，您定義識別符 `exampleA.com` 和 `exampleA.co.uk`。
+ 針對 IdP B，您會定義識別符 `exampleB.com`。

在您的應用程式中，叫用應用程式用戶端的受管登入，以提示每個使用者輸入其電子郵件地址。Amazon Cognito 從電子郵件地址衍生網域、將網域與 IdP 與網域識別符建立關聯，並將您的使用者重新導向至正確的 IdP，並將請求重新導向至包含 `idp_identifier` 請求參數[授權端點](authorization-endpoint.md)的 。例如，如果使用者輸入 `bob@exampleA.co.uk`，則與其互動的下一個頁面是位於 的 IdP 登入頁面`https://auth.exampleA.co.uk/sso/saml`。

您也可以獨立實作相同的邏輯。在您的應用程式中，您可以建置自訂表單來收集使用者輸入，並根據您自己的邏輯將其與正確的 IdP 建立關聯。您可以為每個應用程式租用戶產生自訂入口網站，其中每個連結都會連結到請求參數中具有租用戶識別符的授權端點。

若要收集電子郵件地址並剖析受管登入中的網域，請為您指派給應用程式用戶端的每個 SAML IdP 指派至少一個識別符。根據預設，受管登入畫面會顯示您指派給應用程式用戶端的每個 IdPs的按鈕。不過，如果您已成功指派識別符，您的傳統託管 UI 登入頁面如下所示。

![\[Amazon Cognito 受管登入頁面，顯示本機使用者登入，並提示聯合身分使用者輸入電子郵件地址。\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/cup-saml-identifiers.png)


**注意**  
在傳統託管 UI 中，當您將識別符指派給 IdPs 時，應用程式用戶端的登入頁面會自動提示電子郵件地址。在受管登入體驗中，您必須在品牌編輯器中啟用此行為。在**身分驗證行為**設定類別中，選取**供應商顯示**標題下的**網域搜尋輸入**。

受管登入中的網域剖析要求您使用網域做為 IdP 識別符。如果您為應用程式用戶端的每個 SAML IdPs 指派任何類型的識別符，則該應用程式的受管登入將不再顯示 IdP 選擇按鈕。當您想要使用電子郵件剖析或自訂邏輯來產生重新導向時，請新增 SAML 的 IdP 識別符。當您想要產生無提示重新導向，也希望受管登入頁面顯示 IdPs 清單時，請不要指派識別符，並在授權請求中使用`identity_provider`請求參數。
+ 如果您只將一個 SAML IdP 指派給應用程式用戶端，受管登入頁面會顯示按鈕以使用該 IdP 登入。
+ 如果您為應用程式用戶端啟用的每個 SAML IdP 指派識別符，則受管登入登入頁面中會顯示電子郵件地址的使用者輸入提示。
+ 如果您有多個 IdPs而且您未將識別符指派給所有 IdP，受管登入頁面會顯示一個按鈕，以使用每個指派的 IdP 登入。
+ 如果您將識別符指派給 IdPs並且希望受管登入頁面顯示選取的 IdP 按鈕，請將沒有識別符的新 IdP 新增至您的應用程式用戶端，或建立新的應用程式用戶端。您也可以刪除現有的 IdP，並在沒有識別符的情況下再次新增它。如果您建立新的 IdP，SAML 使用者將建立新的使用者設定檔。此重複作用中使用者可能會在您變更 IdP 組態的月份產生帳單影響。

如需 IdP 設定的詳細資訊，請參閱 [為您的使用者集區配置身分提供者](cognito-user-pools-identity-provider.md)。