

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

# 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 聲明。在此期間過後，您可以從已發佈的中繼資料中移除原始憑證。