

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

# IAM 中的暫時安全憑證
<a name="id_credentials_temp"></a>

您可以使用 AWS Security Token Service (AWS STS) 來建立和提供信任的使用者暫時安全登入資料，以控制對 AWS 資源的存取。暫時性安全憑證的作用幾乎與長期存取金鑰憑證完全相同，而其差異如下：
+ 暫時安全憑證是「短期」**的，如其名稱所暗示。其可設定為在任何地方持續幾分鐘到幾小時不等。登入資料過期後， AWS 就無法再辨識這些登入資料，也無法允許從使用它們提出的 API 請求進行任何類型的存取。
+ 暫時性安全憑證不會與使用者一起儲存，但會動態產生並在請求時提供給使用者。當暫時性安全憑證到期時 (或者即使在此之前)，使用者可以請求新的憑證，只要使用者的請求仍具有可這麼做的許可。

因此，相較於長期憑證，暫時性憑證具有下列優點：
+ 您不需要向應用程式分發或嵌入長期 AWS 安全登入資料。
+ 您可以為使用者提供 AWS 資源的存取權，而不必為其定義 AWS 身分。臨時憑證是[角色](id_roles.md)和[聯合身分](id_roles_providers.md)的基礎。
+ 臨時安全憑證的存留期有限，因此當不再需要時，您不需要更新它們或明確予以撤銷。暫時性安全憑證到期之後，就無法重複使用。您可以指定憑證的有效期，達到最長限制。

## AWS STS 和 AWS 區域
<a name="sts-regionalization"></a>

 AWS STS所產生暫時性安全憑證。根據預設， AWS STS 是位於 的單一端點的全域服務`https://sts.amazonaws.com`。不過，您也可以選擇對任何其他支援區域中的端點進行 AWS STS API 呼叫。這可透過從地理位置較靠近您的區域的伺服器傳送請求，來降低延遲發生機率 (伺服器延遲)。無論您的憑證來自哪個區域，都能全域使用。如需詳細資訊，請參閱 [在 AWS STS 中管理 AWS 區域](id_credentials_temp_enable-regions.md)。

## 暫時性憑證的常見案例
<a name="sts-introduction"></a>

暫時性憑證在涉及聯合身分、委派、跨帳戶存取和 IAM 角色的案例中非常有用。

### 聯合身分
<a name="id-federation"></a>

您可以在 外部的外部系統中管理您的使用者身分， AWS 並授予從這些系統登入的使用者執行 AWS 任務和存取 資源 AWS 的存取權。IAM 支援兩種類型的聯合身分。在這兩種情況下，身分都會存放在 外部 AWS。差別是外部系統所在地點是您的資料中心或外部第三方的 Web 上。若要比較聯合身分的臨時安全憑證的功能，請參閱[比較 AWS STS 登入資料](id_credentials_sts-comparison.md)。

如需關於外部身分提供者的詳細資訊，請參閱[身分提供者和聯合身分 AWS](id_roles_providers.md)。
+ **OpenID Connect (OIDC) 聯合** – 您可以讓使用者使用知名的第三方身分提供者登入，例如 Login with Amazon、Facebook、Google 或任何與 OIDC 相容的提供者。對於您的行動或 Web 應用程式，您不需要建立自訂登入碼或管理自己的使用者身分。使用 OIDC 聯合可協助您保持 AWS 帳戶 安全，因為您不必將 IAM 使用者存取金鑰等長期安全登入資料與您的應用程式一起分發。如需詳細資訊，請參閱[OIDC 聯合身分](id_roles_providers_oidc.md)。

  AWS STS OIDC 聯合支援 Login with Amazon、Facebook、Google 和任何與 OpenID Connect (OIDC) 相容的身分提供者。
**注意**  
對於行動應用程式，我們建議您使用 Amazon Cognito。您可以使用此服務搭配 AWS SDKs進行行動開發，為使用者建立唯一身分，並對其進行驗證，以安全地存取您的 AWS 資源。Amazon Cognito 支援與 相同的身分提供者 AWS STS，也支援未經驗證的 （訪客） 存取，並可讓您在使用者登入時遷移使用者資料。Amazon Cognito 還提供 API 操作以同步使用者資料，如此可在使用者於不同裝置之間移動時進行保留。如需詳細資訊，請參閱 *Amplify 文件* 中的 [Amplify 身分驗證](https://docs.amplify.aws/lib/auth/getting-started/q/platform/js/#authentication-with-amplify)。
+ **SAML 聯合** – 您可以對組織網路中的使用者進行身分驗證，然後為這些使用者提供 的存取權， AWS 而無需為其建立新的 AWS 身分，並要求他們使用不同的登入憑證登入。這稱為臨時存取的*單一登入*方法。 AWS STS 支援開放標準，例如安全性聲明標記語言 (SAML) 2.0，您可以使用 Microsoft AD FS 來利用您的 Microsoft Active Directory。您也可以使用 SAML 2.0 來管理您自己的聯合使用者身分的解決方案。如需詳細資訊，請參閱[SAML 2.0 聯合身分](id_roles_providers_saml.md)。
  + **自訂聯合代理程式** – 您可以使用組織的身分驗證系統來授予 AWS 資源的存取權。如需範例案例，請參閱[啟用 AWS 主控台的自訂身分代理程式存取](id_roles_providers_enable-console-custom-url.md)。
  + **使用 SAML 2.0 的聯合** – 您可以使用您組織的身分驗證系統和 SAML，來授予 AWS 資源的存取。如需詳細資訊和範例案例，請參閱 [SAML 2.0 聯合身分](id_roles_providers_saml.md)。

### 跨帳戶存取的角色
<a name="role_cross-account"></a>

許多組織維護多個 AWS 帳戶。您可以使用角色和跨帳戶存取，來定義一個帳戶中的使用者身分，並使用那些身分來存取屬於您組織的其他帳戶中的 AWS 資源。這就是所謂暫時存取的「委派」**方法。如需有關建立跨帳戶角色的詳細資訊，請參閱 [建立角色以將許可授予 IAM 使用者](id_roles_create_for-user.md)。若要了解在您信任區域 (受信任組織或帳戶) 外帳戶中的主體是否具有擔任您角色的許可，請參閱[什麼是 IAM Access Analyzer？](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html)。

### Amazon EC2 的角色
<a name="role_ec2"></a>

如果您在 Amazon EC2 執行個體上執行應用程式，並且那些應用程式需要存取 AWS 資源，則您可以在您啟動它們時提供暫時安全憑證。這些暫時性安全憑證可供在執行個體上執行的所有應用程式使用，因此您不需要在執行個體上儲存任何長期憑證。如需詳細資訊，請參閱[使用 IAM 角色為在 Amazon EC2 執行個體上執行的應用程式授予許可](id_roles_use_switch-role-ec2.md)。

若要進一步了解 IAM Amazon EC2 角色憑證，請參閱 *Amazon Elastic Compute Cloud User Guide* 中的 [IAM roles for Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)。

### AWS 其他服務
<a name="other-services"></a>

您可以使用臨時安全登入資料來存取大多數 AWS 服務。如需接受暫時性安全性憑證的服務的清單，請參閱[AWS 使用 IAM 的 服務](reference_aws-services-that-work-with-iam.md)。

## 使用臨時憑證的應用程式範例
<a name="id_credentials_temp_sample-apps"></a>

您可以使用 AWS Security Token Service (AWS STS) 來建立信任的使用者，並提供暫時安全登入資料，以控制對 AWS 資源的存取。如需 的詳細資訊 AWS STS，請參閱 [IAM 中的暫時安全憑證](#id_credentials_temp)。若要了解如何使用 AWS STS 來管理臨時安全登入資料，您可以下載下列範例應用程式，以實作完整的範例案例：
+ [AWS 使用 Windows Active Directory、ADFS 和 SAML 2.0 將聯合啟用至 ](https://aws.amazon.com/blogs/security/enabling-federation-to-aws-using-windows-active-directory-adfs-and-saml-2-0/)。示範如何使用企業聯合將存取權委派給 AWS 使用 Windows Active Directory (AD)、Active Directory Federation Services (ADFS) 2.0 和 SAML （安全性聲明標記語言） 2.0 的 。
+ [啟用 AWS 主控台的自訂身分代理程式存取](id_roles_providers_enable-console-custom-url.md)。示範如何建立啟用單一登入 (SSO) 的自訂聯合代理程式，使現有 Active Directory 使用者能夠登入  AWS 管理主控台。
+ [如何使用 Shibboleth 進行 的單一登入 AWS 管理主控台。](https://aws.amazon.com/blogs/security/how-to-use-shibboleth-for-single-sign-on-to-the-aws-management-console/)示範如何使用 [Shibboleth](http://shibboleth.net/) 與 [SAML](id_roles_providers_saml.md) 來提供使用者存取 AWS 管理主控台的單一登入 (SSO) 許可。

### OIDC 聯合身分的範例
<a name="sts-sample-apps-wif"></a>

下列範例應用程式說明如何搭配 Login with Amazon、Amazon Cognito、Facebook 或 Google 等供應商使用 OIDC 聯合。您可以從這些供應商交易身分驗證，以取得臨時 AWS 安全登入資料以存取 AWS 服務。
+ [Amazon Cognito 教學](https://docs.aws.amazon.com/cognito/latest/developerguide/tutorials.html)課程 – 我們建議您使用 Amazon Cognito 搭配 AWS SDKs進行行動開發。Amazon Cognito 是進行行動應用程式身分管理的最便捷的方式，並提供了同步和跨裝置身分驗證等連接功能。如需有關 Amazon Cognito 的詳細資訊，請參閱 *Amplify 文件* 中的 [Amplify 身分驗證](https://docs.amplify.aws/lib/auth/getting-started/q/platform/js/#authentication-with-amplify)。

## 暫時性安全憑證的其他資源。
<a name="id_credentials_temp_related-topics"></a>

以下案例和應用程式可以指導您使用暫時性安全憑證：
+ [如何將 AWS STS SourceIdentity 與您的身分提供者整合](https://aws.amazon.com/blogs/security/how-to-integrate-aws-sts-sourceidentity-with-your-identity-provider/)。此文章說明如何在使用 AWS STS `SourceIdentity` Okta、Ping 或 OneLogin 做為 IdP 時設定 屬性。
+  [OIDC 聯合身分](id_roles_providers_oidc.md)。本節討論如何在使用 OIDC 聯合身分和 `AssumeRoleWithWebIdentity` API 時設定 IAM 角色。
+ [透過 MFA 實現安全的 API 存取](id_credentials_mfa_configure-api-require.md). 本主題說明如何使用角色來要求多重要素驗證 (MFA) 以保護您的帳戶中的敏感 API 動作。

如需 中政策和許可的詳細資訊， AWS 請參閱下列主題：
+ [AWS 資源的存取管理](access.md)
+ [政策評估邏輯](reference_policies_evaluation-logic.md).
+ *Amazon Simple Storage Service 使用者指南*中的[管理 Amazon S3 資源的存取許可](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html)。
+  若要了解在您信任區域 (受信任組織或帳戶) 外帳戶中的主體是否具有擔任您角色的許可，請參閱[什麼是 IAM Access Analyzer？](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html)。

# 比較 AWS STS 登入資料
<a name="id_credentials_sts-comparison"></a>

下表比較傳回暫時安全登入資料之 中 API AWS STS 操作的功能。若要了解可用來在擔任角色時請求暫時性安全憑證的不同方法，請參閱[擔任角色的方法](id_roles_manage-assume.md)。若要了解可讓您傳遞工作階段標籤的不同 AWS STS API 操作，請參閱 [在 中傳遞工作階段標籤 AWS STS](id_session-tags.md)。

**注意**  
您可以將 AWS STS API 呼叫傳送至全域端點或其中一個區域端點。如果您選擇比較靠近您的端點，您可以減少延遲並改善您的 API 呼叫的效能。如果可以不再與原始端點通訊，您也可以選擇將您的呼叫導向至其他區域性端點。如果您使用的是其中一個各種 AWS SDKs，請在進行 API 呼叫之前使用該 SDK 方法來指定區域。如果您手動建構 HTTP API 請求，則必須您自己將請求直接導向到正確的端點。如需詳細資訊，請參閱[*區域與端點*的AWS STS 一節](https://docs.aws.amazon.com/general/latest/gr/rande.html#sts_region)和 [在 AWS STS 中管理 AWS 區域](id_credentials_temp_enable-regions.md)。


|  **AWS STS API**  |  **誰可以呼叫**  |  **憑證存留期 (最小 \$1 最大 \$1 預設)**  |  **MFA 支援**¹  |  **工作階段政策支援**²  |  **產生的暫時憑證限制**  | 
| --- | --- | --- | --- | --- | --- | 
|  [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)  | 具現有暫時性安全憑證的 IAM 使用者或 IAM 角色  | 15 分鐘 \$1 最大工作階段持續時間設定³ \$1 1 小時  | 是  | 是 |  無法呼叫 `GetFederationToken` 或 `GetSessionToken`。  | 
|  [AssumeRoleWithSAML](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html)  | 任何使用者；呼叫者必須傳遞 SAML 身分驗證回應，指出通過已知身分提供者的身分驗證 | 15 分鐘 \$1 最大工作階段持續時間設定³ \$1 1 小時  | 否 | 是 |  無法呼叫 `GetFederationToken` 或 `GetSessionToken`。  | 
|  [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html)  | 任何使用者；發起人必須傳遞符合 OIDC 規範的 JWT 權杖，指出通過已知身分提供者的驗證 | 15 分鐘 \$1 最大工作階段持續時間設定³ \$1 1 小時  | 否 | 是 |  無法呼叫 `GetFederationToken` 或 `GetSessionToken`。  | 
| [GetFederationToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html) | IAM 使用者或 AWS 帳戶根使用者 |  IAM 使用者：15 分鐘 \$1 36 小時 \$1 12 小時 根使用者：15 分鐘 \$1 1 小時 \$1 1 小時  | 否  | 是  |  無法使用 AWS CLI 或 AWS API 呼叫 IAM 操作。此限制不適用主控台工作階段。 無法呼叫 `GetCallerIdentity`.4 以外的 AWS STS 操作 允許 SSO 到主控台。⁵  | 
| [GetSessionToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetSessionToken.html) | IAM 使用者或 AWS 帳戶根使用者 |  IAM 使用者：15 分鐘 \$1 36 小時 \$1 12 小時 根使用者：15 分鐘 \$1 1 小時 \$1 1 小時  | 是  | 否  |  除非請求包含 MFA 資訊，否則無法呼叫 IAM API 操作。 無法呼叫 `AssumeRole`或 以外的 AWS STS API 操作`GetCallerIdentity`。 不允許 SSO 到主控台。⁶  | 

 ¹ **MFA 支援**。您可以在您呼叫 AssumeRole 和 GetSessionToken API 操作時，包含有關 多重要素驗證 (MFA) 裝置的資訊。這可確保 API 呼叫所產生的暫時性安全憑證，僅可由使用 MFA 裝置進行身分驗證的使用者使用。如需詳細資訊，請參閱 [透過 MFA 實現安全的 API 存取](id_credentials_mfa_configure-api-require.md)。

 ² **工作階段政策支援**。當您以程式設計方式為角色或 AWS STS 聯合身分使用者工作階段建立暫時工作階段時，工作階段政策是做為參數傳遞的政策。這個政策會限制工作階段獲派自角色或使用者之以身分為基礎政策的許可。所產生工作階段的許可會是實體的身分類型政策和工作階段政策的交集。工作階段政策不能用來授予超出即將擔任角色之以身分為基礎政策所允許的許可。如需有關角色工作階段許可的詳細資訊，請參閱 [工作階段政策](access_policies.md#policies_session)。

³ **最大工作階段持續時間設定**。使用 `DurationSeconds` 參數來指定 900 秒 (15 分鐘) 到角色的最大工作階段持續時間設定之間的角色工作階段持續時間。若要了解如何檢視角色的最大值，請參閱 [更新角色的最大工作階段持續時間](id_roles_update-role-settings.md#id_roles_update-session-duration)。

⁴ **GetCallerIdentity**。執行此操作不需要任何許可。如果管理員將明確拒絕存取 `sts:GetCallerIdentity` 動作的政策新增到 IAM 使用者或角色，您仍然可以執行此操作。不需要許可，因為當 IAM 使用者或角色被拒絕存取時，會傳回相同的資訊。若要檢視範例回應，請參閱 [我未獲得授權，不得執行：iam:DeleteVirtualMFADevice](troubleshoot.md#troubleshoot_general_access-denied-delete-mfa)。

⁵ **Single sign-on (SSO) 至主控台**。若要支援 SSO，請 AWS 呼叫聯合端點 (`https://signin.aws.amazon.com/federation`) 並傳遞臨時安全登入資料。端點會傳回權杖，您可用來建構 URL，直接將使用者登入主控台，而不需要密碼。如需詳細資訊，請參閱 AWS 安全部落格中的 [啟用 SAML 2.0 聯合主體來存取 AWS 管理主控台](id_roles_providers_enable-console-saml.md) 和[如何啟用 AWS 管理主控台的跨帳戶存取](https://aws.amazon.com/blogs/security/how-to-enable-cross-account-access-to-the-aws-management-console)。

⁶ 在您擷取暫時憑證後，您無法透過將憑證傳遞到聯合單一登入端點，來存取 AWS 管理主控台 。如需詳細資訊，請參閱[啟用 AWS 主控台的自訂身分代理程式存取](id_roles_providers_enable-console-custom-url.md)。

# 服務持有人權杖
<a name="id_credentials_bearer"></a>

有些 AWS 服務需要您取得 AWS STS 服務承載字符的許可，才能以程式設計方式存取其資源。這些服務支援的協定會要求您使用持有人權杖，而不是使用傳統的 [AWS API 請求的簽章版本 4](reference_sigv.md)。當您執行需要承載字符的 AWS CLI 或 AWS API 操作時， AWS 服務會代表您請求承載字符。該服務會提供您權杖，接著您就可以使用該權杖在該服務中執行後續操作。

AWS STS 服務承載字符包含原始主體身分驗證中可能影響您許可的資訊。此資訊可能包括主體標籤、工作階段標籤和工作階段政策。權杖的存取金鑰 ID 會以 `ABIA` 字首開頭。這可協助您在 CloudTrail 日誌中識別出使用服務持有人權杖來執行的操作。

**重要**  
持有人權杖只能用於對產生該權杖之服務的呼叫，以及產生該權杖的區域中。您無法在其他服務或區域中使用持有人權杖執行操作。

支援承載字符的服務範例是 AWS CodeArtifact。您必須先呼叫 `aws codeartifact get-authorization-token`操作，才能使用 NPM、Maven 或 PIP 等套件管理員與 AWS CodeArtifact 互動。此操作會傳回承載字符，您可以用來執行 AWS CodeArtifact 操作。或者，您也可以使用能完成相同操作並自動設定您用戶端的 `aws codeartifact login` 命令。

如果您在為您產生承載字符的 AWS 服務中執行 動作，您必須在 IAM 政策中擁有下列許可：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowServiceBearerToken",
            "Effect": "Allow",
            "Action": "sts:GetServiceBearerToken",
            "Resource": "*"
        }
    ]
}
```

------

如需服務持有人權杖範例，請參閱 *AWS CodeArtifact* 使用者指南中的[將以身分為基礎的政策用於 AWS CodeArtifact](https://docs.aws.amazon.com/codeartifact/latest/ug/auth-and-access-control-iam-identity-based-access-control.html)。

# 請求臨時安全憑證
<a name="id_credentials_temp_request"></a>

若要請求臨時安全登入資料，您可以在 AWS API 中使用 AWS Security Token Service (AWS STS) 操作。這包括建立和提供信任使用者暫時安全登入資料的操作，這些登入資料可以控制對 AWS 資源的存取。如需 的詳細資訊 AWS STS，請參閱 [IAM 中的暫時安全憑證](id_credentials_temp.md)。若要了解可用來在擔任角色時請求暫時性安全憑證的不同方法，請參閱[擔任角色的方法](id_roles_manage-assume.md)。

若要呼叫 API 操作，您可以使用其中一個 [AWS 軟體開發套件](https://aws.amazon.com/tools/)。適用於多種程式設計語言和環境的軟體開發套件，包括 Java、.NET、Python、Ruby、Android 和 iOS。開發套件會負責的工作諸如以密碼演算法簽署請求，必要時重試請求，以及處理錯誤回應。您也可以使用 AWS STS 查詢 API，如 [AWS Security Token Service API 參考](https://docs.aws.amazon.com/STS/latest/APIReference/)中所述。最後，兩個命令列工具支援 AWS STS 命令： [AWS Command Line Interface](https://aws.amazon.com/documentation/cli)和 [AWS Tools for Windows PowerShell](https://aws.amazon.com/documentation/powershell)。

 AWS STS API 操作會使用包含存取金鑰對和工作階段字符的臨時安全登入資料建立新的工作階段。存取金鑰對包含存取金鑰 ID 和秘密金鑰。使用者 (或使用者執行的應用程式) 可以使用這些憑證來存取您的資源。您可以建立角色工作階段，並使用 AWS STS API 操作以程式設計方式傳遞工作階段政策和工作階段標籤。所產生工作階段許可會是角色的以身分為基礎的政策和工作階段政策的交集。如需有關工作階段政策的詳細資訊，請參閱 [工作階段政策](access_policies.md#policies_session)。如需有關工作階段標籤的詳細資訊，請參閱 [在 中傳遞工作階段標籤 AWS STS](id_session-tags.md)。

**注意**  
 AWS STS API 操作傳回的工作階段字符大小不固定。我們強烈建議您不對大小上限做出任何假設。一般權杖大小小於 4096 個位元組，但有可能會不同。

## 使用 AWS STS 搭配 AWS 區域
<a name="using_sts_regions"></a>

您可以將 AWS STS API 呼叫傳送至全域端點或其中一個區域端點。如果您選擇比較靠近您的端點，您可以減少延遲並改善您的 API 呼叫的效能。如果可以不再與原始端點通訊，您也可以選擇將您的呼叫導向至其他區域性端點。如果您使用的是其中一個各種 AWS SDKs，請在進行 API 呼叫之前使用該 SDK 方法來指定區域。如果您手動建構 HTTP API 請求，則必須您自己將請求直接導向到正確的端點。如需詳細資訊，請參閱[*區域與端點*的AWS STS 一節](https://docs.aws.amazon.com/general/latest/gr/rande.html#sts_region)和 [在 AWS STS 中管理 AWS 區域](id_credentials_temp_enable-regions.md)。

以下是您可以用來取得臨時登入資料的 API 操作，以便在 AWS 環境和應用程式中使用。

## 透過自訂身分經紀人請求跨帳戶委派和聯合身分的憑證
<a name="api_assumerole"></a>

[https://docs.aws.amazon.com//STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com//STS/latest/APIReference/API_AssumeRole.html) API 操作有助於讓現有的 IAM 使用者存取他們尚未存取 AWS 的資源。例如，使用者可能需要存取另一個 AWS 帳戶中的資源。它也能夠用來暫時獲得特殊許可，例如，提供多重要素驗證 (MFA)。您必須使用作用中的登入資料呼叫此 API。若要了解誰可以呼叫此操作，請參閱 [比較 AWS STS 登入資料](id_credentials_sts-comparison.md)。如需詳細資訊，請參閱[建立角色以將許可授予 IAM 使用者](id_roles_create_for-user.md)及[透過 MFA 實現安全的 API 存取](id_credentials_mfa_configure-api-require.md)。

**透過自訂身分經紀人請求跨帳戶委派和聯合身分的臨時安全憑證**

1. 使用您的 AWS 安全登入資料進行驗證。必須使用有效的 AWS 安全憑證進行此呼叫。

1. 呼叫 [https://docs.aws.amazon.com//STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com//STS/latest/APIReference/API_AssumeRole.html) 操作。

以下範例顯示使用 `AssumeRole` 的範例請求及回應。此範例請求假設指定時間內的 `demo` 角色具有已包含的[工作階段政策](access_policies.md#policies_session)、[工作階段標籤](id_session-tags.md)、[外部 ID](id_roles_common-scenarios_third-party.md) 和[來源身分](id_credentials_temp_control-access_monitor.md)。產生的工作階段名為 `John-session`。

**Example 範例請求**  

```
https://sts.amazonaws.com/
?Version=2011-06-15
&Action=AssumeRole
&RoleSessionName=John-session
&RoleArn=arn:aws:iam::123456789012:role/demo
&Policy=%7B%22Version%22%3A%222012-10-17		 	 	 %22%2C%22Statement%22%3A%5B%7B%22Sid%22%3A%20%22Stmt1%22%2C%22Effect%22%3A%20%22Allow%22%2C%22Action%22%3A%20%22s3%3A*%22%2C%22Resource%22%3A%20%22*%22%7D%5D%7D
&DurationSeconds=1800
&Tags.member.1.Key=Project
&Tags.member.1.Value=Pegasus
&Tags.member.2.Key=Cost-Center
&Tags.member.2.Value=12345
&ExternalId=123ABC
&SourceIdentity=DevUser123
&AUTHPARAMS
```

在上述範例中顯示的政策值是以下政策的 URL 編碼版本：

------
#### [ JSON ]

****  

```
{"Version":"2012-10-17",		 	 	 "Statement":[{"Sid":"Stmt1","Effect":"Allow","Action":"s3:*","Resource":"*"}]}
```

------

範例中的 `AUTHPARAMS` 參數是*簽章*的預留位置。簽章是您在 AWS HTTP API 請求中必須包含的身分驗證資訊。我們建議使用 [AWS 開發套件](https://aws.amazon.com/tools/)來建立 API 請求。執行此作業的其中一個好處是開發套件會為您處理請求簽署。如果您必須手動建立和簽署 API 請求，請參閱《》中的[使用簽章版本 4 簽署 AWS 請求](https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html)，以*Amazon Web Services 一般參考*了解如何簽署請求。

除了暫時性安全憑證外，回應包含聯合身分使用者的 Amazon Resource Name (ARN) 和憑證過期時間。

**Example 回應範例**  

```
<AssumeRoleResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
<AssumeRoleResult>
<SourceIdentity>DevUser123</SourceIdentity>
<Credentials>
  <SessionToken>
   AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQW
   LWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGd
   QrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU
   9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz
   +scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==
  </SessionToken>
  <SecretAccessKey>
   wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY
  </SecretAccessKey>
  <Expiration>2019-07-15T23:28:33.359Z</Expiration>
  <AccessKeyId>AKIAIOSFODNN7EXAMPLE</AccessKeyId>
</Credentials>
<AssumedRoleUser>
  <Arn>arn:aws:sts::123456789012:assumed-role/demo/John</Arn>
  <AssumedRoleId>ARO123EXAMPLE123:John</AssumedRoleId>
</AssumedRoleUser>
<PackedPolicySize>8</PackedPolicySize>
</AssumeRoleResult>
<ResponseMetadata>
<RequestId>c6104cbe-af31-11e0-8154-cbc7ccf896c7</RequestId>
</ResponseMetadata>
</AssumeRoleResponse>
```

**注意**  
 AWS 轉換會將傳遞的工作階段政策和工作階段標籤壓縮為具有個別限制的封裝二進位格式。即使您的純文字符合其他需求，您的請求也可能因不符限制而失敗。`PackedPolicySize` 回應元素會按百分比指出請求的政策和標籤與大小上限的距離。

## 透過 OIDC 提供者請求憑證
<a name="api_assumerolewithwebidentity"></a>

[https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) API 操作會傳回一組臨時 AWS 安全憑證，以換取 JSON Web 權杖 (JWT)。其中包括公有身分提供者 (例如 Login with Amazon、Facebook、Google)，以及發行與 OpenID Connect (OIDC) 探索相容的 JWT 的提供者 (例如 GitHub actions 或 Azure Devops)。如需詳細資訊，請參閱[OIDC 聯合身分](id_roles_providers_oidc.md)。

**注意**  
`AssumeRoleWithWebIdentity` 請求未經簽名，且不需要 AWS 憑證。

**透過 OIDC 提供者請求憑證**

1. 呼叫 [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) 操作。

   當您呼叫 時`AssumeRoleWithWebIdentity`， 會使用 IdP 的 JSON Web 金鑰集 (JWKS) 提供的公有金鑰驗證數位簽章，以 AWS 驗證顯示的字符。如果字符有效，且符合 IAM 角色信任政策中規定的所有條件， 會 AWS 傳回下列資訊給您：
   + 一組暫時性安全憑證。這些包含存取金鑰 ID、私密存取金鑰和工作階段權杖。
   + 所擔任角色的角色 ID 和 ARN。
   + `SubjectFromWebIdentityToken` 值，其中包含唯一的使用者 ID。

1. 然後，您的應用程式可能會使用回應中傳回的臨時安全登入資料來進行 AWS API 呼叫。這與使用長期安全登入資料進行 AWS API 呼叫的程序相同。差別在於您必須包含工作階段字符，讓 驗證 AWS 臨時安全登入資料是否有效。

您的應用程式應快取 傳回的登入資料 AWS STS ，並視需要重新整理。如果您的應用程式是使用 AWS SDK 建置，則 SDK 具有登入資料提供者，可在登入資料過期之前處理呼叫`AssumeRoleWithWebIdentity`和重新整理 AWS 登入資料。如需詳細資訊，請參閱 *AWS SDKs and Tools Reference Guide* 中的 [AWS SDKs and Tools standardized credential providers](https://docs.aws.amazon.com/sdkref/latest/guide/standardized-credentials.html)。

## 透過 SAML 2.0 身分提供者請求憑證
<a name="api_assumerolewithsaml"></a>

[https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) API 操作會傳回 SAML 聯合身分主體的一組臨時安全憑證，這些主體透過您組織現有的身分系統進行驗證。使用者還必須使用 [SAML 2.0 (安全聲明標記語言)](https://www.oasis-open.org/standards#samlv2.0) 來將身分驗證和授權資訊傳遞至 AWS。這個 API 操作適用於整合他們自己的身分系統的組織 (例如，Windows Active Directory 或 OpenLDAP)，而軟體可以產生 SAML 聲明。這種整合會提供有關使用者身分和許可 (例如 Active Directory Federation Services 或 Shibboleth) 的資訊。如需詳細資訊，請參閱[SAML 2.0 聯合身分](id_roles_providers_saml.md)。

1. 呼叫 [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) 操作。

   這是未簽署的呼叫，這表示您不需要在提出請求之前驗證 AWS 安全登入資料。
**注意**  
`AssumeRoleWithSAML` 呼叫未簽署 (加密)。因此，如果請求是透過信任的媒介傳輸，您應該只包含選用的工作階段政策。在這種情況下，有人可以更改政策以移除限制。

1. 當您呼叫 時`AssumeRoleWithSAML`， 會 AWS 驗證 SAML 聲明的真實性。假設身分提供者驗證聲明， 會 AWS 傳回下列資訊給您：
   + 一組暫時性安全憑證。這些包含存取金鑰 ID、私密存取金鑰和工作階段權杖。
   + 所擔任角色的角色 ID 和 ARN。
   + `Audience` 值，其包含 SAML 聲明的 `Recipient` 元素的 `SubjectConfirmationData` 屬性值。
   + `Issuer` 值，其包含 SAML 聲明的 `Issuer` 元素的值。
   + 包含從 SAML 供應商的值、 AWS 帳戶 ID 和易記名稱建置的雜湊`Issuer`值的`NameQualifier`元素。當與 `Subject` 元素結合使用時，這些內容可以唯一識別 SAML 聯合身分主體。
   + `Subject` 元素，其包含 SAML 聲明的 `NameID` 元素的 `Subject` 元素值。
   + `SubjectType` 元素指出 `Subject` 元素的格式。此值可以是 `persistent`、`transient` 或在您的 SAML 聲明中使用的 `Format` 與 `Subject` 元素的完整 `NameID` URI。如需 `NameID` 元素的 `Format` 屬性的詳細資訊，請參閱 [為身分驗證回應設定 SAML 聲明](id_roles_providers_create_saml_assertions.md)。

1. 使用回應中傳回的臨時安全登入資料來進行 AWS API 呼叫。這與使用長期安全登入資料進行 AWS API 呼叫的程序相同。差別在於您必須包含工作階段權杖，這個權杖可讓 AWS 驗證臨時安全憑證是否有效。

您的應用程式應該快取憑證。預設情況下，憑證會在一小時後到期。如果您不是在 AWS SDK 中使用 [AmazonSTSCredentialsProvider](https://aws.amazon.com/blogs/mobile/using-the-amazoncredentialsprovider-protocol-in-the-aws-sdk-for-ios) 動作，則由您和應用程式`AssumeRoleWithSAML`再次呼叫。呼叫此操作，或取得一組新的暫時性安全憑證，之後舊的憑證才會過期。

## 透過自訂身分經紀人請求憑證
<a name="api_getfederationtoken"></a>

[https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html) API 操作會傳回 AWS STS 聯合身分使用者主體的一組臨時安全登入資料。此 API 與 `AssumeRole` 不同，其中的預設過期時段是實質上比較長 (12 小時，而不是 1 小時)。此外，您可以使用 `DurationSeconds` 參數來指定暫時性安全憑證的持續時間，以保持有效。產生的憑證在指定的持續時間內有效，介於 900 秒 (15 分鐘) 至 129,600 秒 (36 小時) 之間。較長的過期期間有助於減少對 的呼叫數量， AWS 因為您不需要經常取得新的登入資料。

1. 使用特定 IAM 使用者 AWS 的安全登入資料進行驗證。此呼叫必須使用有效的 AWS 安全登入資料進行。

1. 呼叫 [https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html) 操作。

`GetFederationToken` 呼叫會傳回暫時性安全憑證，該憑證由工作階段字符、存取金鑰、私密金鑰和過期時間組成。如果您想要管理您組織內的許可 (例如，使用 Proxy 應用程式以指派許可)，您可以使用 `GetFederationToken`。

以下範例顯示使用 `GetFederationToken` 的範例請求及回應。此範例請求會將指定期間的呼叫發起使用者與[工作階段政策](access_policies.md#policies_session) ARN 和[工作階段標籤](id_session-tags.md)聯合在一起。產生的工作階段名為 `Jane-session`。

**Example 範例請求**  

```
https://sts.amazonaws.com/
?Version=2011-06-15
&Action=GetFederationToken
&Name=Jane-session
&PolicyArns.member.1.arn==arn%3Aaws%3Aiam%3A%3A123456789012%3Apolicy%2FRole1policy
&DurationSeconds=1800
&Tags.member.1.Key=Project
&Tags.member.1.Value=Pegasus
&Tags.member.2.Key=Cost-Center
&Tags.member.2.Value=12345
&AUTHPARAMS
```

上述範例中顯示的政策 ARN 包含以下 URL 編碼 ARN：

`arn:aws:iam::123456789012:policy/Role1policy`

此外，請注意範例中的 `&AUTHPARAMS` 參數表示身分驗證資訊的預留位置。這是簽章**，您必須將其包含在 AWS HTTP API 請求中。我們建議使用 [AWS 開發套件](https://aws.amazon.com/tools/)來建立 API 請求。執行此作業的其中一個好處是開發套件會為您處理請求簽署。如果您必須手動建立和簽署 API 請求，請前往 中的[使用簽章版本 4 簽署 AWS 請求](https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html)*Amazon Web Services 一般參考*，了解如何簽署請求。

除了暫時性安全憑證外，回應包含聯合身分使用者的 Amazon Resource Name (ARN) 和憑證過期時間。

**Example 回應範例**  

```
<GetFederationTokenResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
<GetFederationTokenResult>
<Credentials>
  <SessionToken>
   AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQW
   LWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGd
   QrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU
   9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz
   +scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCEXAMPLE==
  </SessionToken>
  <SecretAccessKey>
  wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY
  </SecretAccessKey>
  <Expiration>2019-04-15T23:28:33.359Z</Expiration>
  <AccessKeyId>AKIAIOSFODNN7EXAMPLE;</AccessKeyId>
</Credentials>
<FederatedUser>
  <Arn>arn:aws:sts::123456789012:federated-user/Jean</Arn>
  <FederatedUserId>123456789012:Jean</FederatedUserId>
</FederatedUser>
<PackedPolicySize>4</PackedPolicySize>
</GetFederationTokenResult>
<ResponseMetadata>
<RequestId>c6104cbe-af31-11e0-8154-cbc7ccf896c7</RequestId>
</ResponseMetadata>
</GetFederationTokenResponse>
```

**注意**  
 AWS 轉換會將傳遞的工作階段政策和工作階段標籤壓縮為具有個別限制的封裝二進位格式。即使您的純文字符合其他需求，您的請求也可能因不符限制而失敗。`PackedPolicySize` 回應元素會按百分比指出請求的政策和標籤與大小上限的距離。

AWS 建議您在資源層級授予許可 （例如，您將資源型政策連接到 Amazon S3 儲存貯體），您可以省略 `Policy` 參數。不過，如果您未包含 AWS STS 聯合身分使用者主體的政策，則暫時安全登入資料將不會授予任何許可。在這種情況下，您「必須」**使用資源政策，來授予聯合身分使用者存取您 AWS 資源的許可。

例如，假設您的 AWS 帳戶 號碼是 111122223333，而且您想要允許 Susan 存取的 Amazon S3 儲存貯體。Susan 的暫時性安全憑證不包含儲存貯體的政策。在這種情況下，您需要確保儲存貯體具有其 ARN 與 Susan 的 ARN 相符的政策，例如 `arn:aws:sts::111122223333:federated-user/Susan`。

## 為不信任環境中的使用者請求憑證
<a name="api_getsessiontoken"></a>

[https://docs.aws.amazon.com/STS/latest/APIReference/API_GetSessionToken.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetSessionToken.html) API 操作會傳回現有 IAM 使用者的一組臨時安全憑證。這有助於提供增強的安全性，例如僅在 IAM 使用者啟用 MFA 時允許 AWS 請求。因為憑證為暫時性，它們可在您有透過較不安全環境存取您資源的 IAM 使用者時，提供增強的安全性。較不安全環境的範例包含行動裝置或 Web 瀏覽器。

1. 使用特定 IAM 使用者 AWS 的安全登入資料進行驗證。此呼叫必須使用有效的 AWS 安全登入資料進行。

1. 呼叫 [https://docs.aws.amazon.com/STS/latest/APIReference/API_GetSessionToken.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetSessionToken.html) 操作。

1. `GetSessionToken` 會傳回暫時性安全憑證，其由工作階段字符、存取金鑰 ID 和私密存取金鑰組成。

在預設情況下，IAM 使用者的暫時性安全憑證的有效期最長為 12 小時。但是，您可以使用 `DurationSeconds` 參數請求持續時間最短為 15 分鐘最長為 36 小時。基於安全考量， 的字符的持續時間限制 AWS 帳戶根使用者 為一小時。

以下範例顯示使用 `GetSessionToken` 的範例請求及回應。回應還包括暫時性安全憑證的過期時間。

**Example 範例請求**  

```
https://sts.amazonaws.com/
?Version=2011-06-15
&Action=GetSessionToken
&DurationSeconds=1800
&AUTHPARAMS
```

範例中的 `AUTHPARAMS` 參數是*簽章*的預留位置。簽章是您在 AWS HTTP API 請求中必須包含的身分驗證資訊。我們建議使用 [AWS 開發套件](https://aws.amazon.com/tools/)來建立 API 請求。執行此作業的其中一個好處是開發套件會為您處理請求簽署。如果您必須手動建立和簽署 API 請求，請前往 中的[使用簽章版本 4 簽署 AWS 請求](https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html)*Amazon Web Services 一般參考*，了解如何簽署請求。

**Example 回應範例**  

```
<GetSessionTokenResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
<GetSessionTokenResult>
<Credentials>
  <SessionToken>
   AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/L
   To6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3z
   rkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtp
   Z3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE
  </SessionToken>
  <SecretAccessKey>
  wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY
  </SecretAccessKey>
  <Expiration>2011-07-11T19:55:29.611Z</Expiration>
  <AccessKeyId>AKIAIOSFODNN7EXAMPLE</AccessKeyId>
</Credentials>
</GetSessionTokenResult>
<ResponseMetadata>
<RequestId>58c5dbae-abef-11e0-8cfe-09039844ac7d</RequestId>
</ResponseMetadata>
</GetSessionTokenResponse>
```

或者，`GetSessionToken`請求可以包含 AWS 多重要素驗證 (MFA) 驗證的 `SerialNumber`和 `TokenCode`值。如果提供的值有效， AWS STS 會提供包含 MFA 身分驗證狀態的臨時安全登入資料。然後，只要 MFA 身分驗證有效，就可以使用臨時安全登入資料來存取受 MFA 保護的 API 操作或 AWS 網站。

以下範例顯示 `GetSessionToken` 請求，其中包含 MFA 驗證碼和裝置序號。

```
https://sts.amazonaws.com/
?Version=2011-06-15
&Action=GetSessionToken
&DurationSeconds=7200
&SerialNumber=YourMFADeviceSerialNumber
&TokenCode=123456
&AUTHPARAMS
```

**注意**  
對 的呼叫 AWS STS 可以是全域端點或您啟用 的任何區域端點 AWS 帳戶。如需詳細資訊，請參閱[*區域與端點*的AWS STS 一節](https://docs.aws.amazon.com/general/latest/gr/rande.html#sts_region)。  
範例中的 `AUTHPARAMS` 參數是*簽章*的預留位置。簽章是您在 AWS HTTP API 請求中必須包含的身分驗證資訊。我們建議使用 [AWS 開發套件](https://aws.amazon.com/tools/)來建立 API 請求。執行此作業的其中一個好處是開發套件會為您處理請求簽署。如果您必須手動建立和簽署 API 請求，請參閱《》中的[使用簽章版本 4 簽署 AWS 請求](https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html)，以*Amazon Web Services 一般參考*了解如何簽署請求。

# 搭配 AWS 資源使用臨時登入資料
<a name="id_credentials_temp_use-resources"></a>

您可以使用臨時安全登入資料，使用 AWS CLI 或 AWS API （使用 [AWS SDKs](https://aws.amazon.com/tools/)) 對 AWS 資源提出程式設計請求。暫時性憑證提供的許可與長期安全憑證許可相同，例如 IAM 使用者憑證。不過，有幾個差異：
+ 當您使用臨時安全登入資料進行呼叫時，呼叫必須包含工作階段字符，該字符會與這些臨時登入資料一起傳回。 AWS 會使用工作階段字符來驗證臨時安全登入資料。
+ 暫時性憑證在指定的間隔時間後到期。暫時性憑證到期後，使用這些憑證進行的任何呼叫都將失敗，所以您必須產生一組新的暫時性憑證。暫時性憑證無法延期或重新整理超過原始指定間隔。
+ 當您使用暫時憑證發出請求時，您的主體可能會包含一組標籤。這些標籤來自工作階段標籤和連接到您擔任角色的標籤。如需有關工作階段標籤的詳細資訊，請參閱 [在 中傳遞工作階段標籤 AWS STS](id_session-tags.md)。

如果您使用的是 [AWS SDK](https://aws.amazon.com/tools)、[AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/) (AWS CLI) 或 [Tools for Windows PowerShell](https://aws.amazon.com/powershell)，則取得和使用臨時安全憑證的方式會隨內容而有所不同。如果您在 EC2 執行個體內執行程式碼 AWS CLI或 Tools for Windows PowerShell 命令，您可以利用 Amazon EC2 的角色。否則，您可以呼叫 [AWS STS API](https://docs.aws.amazon.com/STS/latest/APIReference/) 以取得暫時憑證，然後明確地使用他們呼叫 AWS 服務。

**注意**  
您可以使用 AWS Security Token Service (AWS STS) 來建立信任的使用者，並提供暫時安全登入資料，以控制對 AWS 資源的存取。如需 的詳細資訊 AWS STS，請參閱 [IAM 中的暫時安全憑證](id_credentials_temp.md)。 AWS STS 是一項全域服務，其在 具有預設端點`https://sts.amazonaws.com`。此端點位在美國東部 (維吉尼亞北部) 區域，但您從此端點和其他端點取得的憑證為全域有效。這些憑證可配合任何區域中的服務和資源使用。您也可以選擇對任何支援區域中的端點進行 AWS STS API 呼叫。從地理位置較靠近您的區域的伺服器提出請求，可以降低延遲發生機率。無論您的憑證來自哪個區域，都能全域使用。如需詳細資訊，請參閱 [在 AWS STS 中管理 AWS 區域](id_credentials_temp_enable-regions.md)。

**Contents**
+ [在 Amazon EC2 執行個體中使用暫時憑證](#using-temp-creds-sdk-ec2-instances)
+ [搭配 AWS SDKs](#using-temp-creds-sdk)
+ [搭配 使用臨時安全登入資料 AWS CLI](#using-temp-creds-sdk-cli)
+ [使用暫時性安全憑證與 API 操作](#RequestWithSTS)
+ [其他資訊](#using-temp-creds-more-info)

## 在 Amazon EC2 執行個體中使用暫時憑證
<a name="using-temp-creds-sdk-ec2-instances"></a>

如果您想要在 EC2 執行個體內執行 AWS CLI 命令或程式碼，建議取得登入資料的方式是使用 [Amazon EC2 的角色](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)。您建立 IAM 角色，指定要授予在 EC2 執行個體上執行之應用程式的許可。當您啟動執行個體時，會建立角色與執行個體的關聯。

然後 AWS CLI，在執行個體上執行的應用程式和 Tools for Windows PowerShell 命令可以從執行個體中繼資料取得自動臨時安全登入資料。您不必明確取得暫時安全憑證。適用於 Windows PowerShell AWS SDKs AWS CLI和 Tools 會自動從 EC2 執行個體中繼資料服務 (IMDS) 取得憑證並使用它們。暫時性憑證擁有您為與執行個體定義關聯的角色所定義的許可。

如需詳細資訊及範例，請參閱下列：
+  [使用 IAM 角色授予 AWS Amazon Elastic Compute Cloud 上資源的存取權](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/java-dg-roles.html)： 適用於 Java 的 AWS SDK
+  [使用 IAM 角色授予存取權](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-hosm.html) — 適用於 .NET 的 AWS SDK 
+  [建立角色](https://docs.aws.amazon.com/sdk-for-ruby/latest/developer-guide/iam-example-create-role.html) — 適用於 Ruby 的 AWS SDK

## 搭配 AWS SDKs
<a name="using-temp-creds-sdk"></a>

若要在程式碼中使用臨時安全登入資料，請以程式設計方式呼叫類似 的 AWS STS API，`AssumeRole`並擷取產生的登入資料和工作階段字符。然後，您可以將這些值用作後續呼叫的登入資料 AWS。下列範例顯示假碼，說明如何在使用 AWS SDK 時使用臨時安全登入資料：

```
assumeRoleResult = AssumeRole(role-arn);
tempCredentials = new SessionAWSCredentials(
   assumeRoleResult.AccessKeyId, 
   assumeRoleResult.SecretAccessKey, 
   assumeRoleResult.SessionToken);
s3Request = CreateAmazonS3Client(tempCredentials);
```

如需使用 Python 撰寫的範例 (使用 [適用於 Python (Boto) 的 AWS SDK](https://aws.amazon.com/sdk-for-python/))，請參閱[切換到 IAM 角色 (AWS API)](id_roles_use_switch-role-api.md)。此範例會示範如何呼叫 `AssumeRole` 以取得暫時安全憑證，然後使用這些憑證呼叫 Amazon S3。

如需如何呼叫 `AssumeRole`、`GetFederationToken` 以及其他 API 操作的詳細資訊，請參閱 [AWS Security Token Service API 參考](https://docs.aws.amazon.com/STS/latest/APIReference/)。有關從結果取得臨時安全憑證和工作階段權杖的詳細資訊，請參閱您正在使用的軟體開發套件的說明文件。您可以在 SDK **SDKs 和工具組**區段的主要文件頁面上找到所有 AWS SDKs 的文件。 [AWS](https://aws.amazon.com/documentation)

您必須在舊的憑證到期之前，確實取得一組新的憑證。在某些軟體開發套件中，您可以使用為您管理重新整理憑證程序的提供者；檢查您正在使用的開發套件的文件。

## 搭配 使用臨時安全登入資料 AWS CLI
<a name="using-temp-creds-sdk-cli"></a>

您可以使用暫時性安全憑證與 AWS CLI。這很適合用於測試政策。

若使用 [AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/)，您便可以呼叫 [AWS STS API](https://docs.aws.amazon.com/STS/latest/APIReference/) (例如 `AssumeRole` 或 `GetFederationToken`)，然後擷取產生的輸出。以下範例顯示對 `AssumeRole` 的呼叫，其會傳送輸出至檔案。在此範例中，假設 `profile` 參數是 AWS CLI 組態檔案中的設定檔。同時也假設會參考有權擔任角色之 IAM 使用者的憑證。

```
aws sts assume-role --role-arn arn:aws:iam::123456789012:role/role-name --role-session-name "RoleSession1" --profile IAM-user-name > assume-role-output.txt
```

當命令完成時，您可以從您路由的任何地方擷取存取金鑰 ID、私密存取金鑰和工作階段權杖。您可以手動或使用指令碼執行這項作業。然後，您可以將這些值指派給環境變數。

當您執行 AWS CLI 命令時， 會先在環境變數中 AWS CLI 尋找特定順序的登入資料，然後在組態檔案中尋找登入資料。因此，在您將臨時登入資料放入環境變數之後， 預設 AWS CLI 會使用這些登入資料。（如果您在 命令中指定`profile`參數， 會 AWS CLI 略過環境變數。 相反地， 會在組態檔案中 AWS CLI 尋找，這可讓您視需要覆寫環境變數中的登入資料。) 

下列範例示範如何設定暫時安全登入資料的環境變數，然後呼叫 AWS CLI 命令。由於 AWS CLI 命令中不包含 `profile` 參數，因此 會先在環境變數中 AWS CLI 尋找登入資料，因此會使用臨時登入資料。

**Linux**

```
$ export AWS_ACCESS_KEY_ID=ASIAIOSFODNN7EXAMPLE
$ export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
$ export AWS_SESSION_TOKEN=AQoDYXdzEJr...<remainder of session token>
$ aws ec2 describe-instances --region us-west-1
```

**Windows**

```
C:\> SET AWS_ACCESS_KEY_ID=ASIAIOSFODNN7EXAMPLE
C:\> SET AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
C:\> SET AWS_SESSION_TOKEN=AQoDYXdzEJr...<remainder of token> 
C:\> aws ec2 describe-instances --region us-west-1
```

## 使用暫時性安全憑證與 API 操作
<a name="RequestWithSTS"></a>

如果您要向 提出直接 HTTPS API 請求 AWS，您可以使用從 AWS Security Token Service () 取得的臨時安全登入資料來簽署這些請求AWS STS。若要這樣做，您可以使用您從中接收的存取金鑰 ID 和私密存取金鑰 AWS STS。使用存取金鑰 ID 和私密存取金鑰簽署請求的方式，就和使用長期憑證簽署請求一樣。您也可以將您收到的工作階段字符新增至您的 API 請求 AWS STS。您將工作階段權杖新增到 HTTP 標頭，或查詢名為 `X-Amz-Security-Token` 的字串參數。您將工作階段權杖新增到 HTTP 標頭「或」**查詢字串參數，但不是兩者。如需簽署 HTTPS API 請求的詳細資訊，請參閱《》中的[簽署 AWS API 請求](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html)*AWS 一般參考*。

## 其他資訊
<a name="using-temp-creds-more-info"></a>

如需將 AWS STS 與其他 AWS 服務搭配使用的詳細資訊，請參閱下列連結：
+ **Amazon S3** 請參閱 *《Amazon Simple Storage Service 使用者指南》*中的[使用 IAM 使用者暫時憑證提出請求](https://docs.aws.amazon.com/AmazonS3/latest/userguide/AuthUsingTempSessionToken.html)或[使用聯合身分使用者暫時憑證提出請求](https://docs.aws.amazon.com/AmazonS3/latest/userguide/AuthUsingTempFederationToken.html)。
+ **Amazon SNS**。請參閱《Amazon Simple Queue Service 開發人員指南》**中的[將身分型政策與 Amazon SNS 搭配使用](https://docs.aws.amazon.com/sns/latest/dg/UsingIAMwithSNS.html#UsingTemporarySecurityCredentials_SNS)。
+ **Amazon SQS** 請參閱《Amazon Simple Queue Service 開發人員指南》**中的 [Amazon SQS 中的 Identity and Access Management](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/UsingIAM.html#UsingTemporarySecurityCredentials_SQS)。
+ **Amazon SimpleDB**。請參閱[使用臨時安全憑證](https://docs.aws.amazon.com/AmazonSimpleDB/latest/DeveloperGuide/index.html?UsingTemporarySecurityCredentials_SDB.html)中的*Amazon SimpleDB 開發人員指南*。

# 臨時安全憑證的許可
<a name="id_credentials_temp_control-access"></a>

您可以使用 AWS Security Token Service (AWS STS) 來建立信任的使用者，並提供暫時安全登入資料，以控制對 AWS 資源的存取。如需 的詳細資訊 AWS STS，請參閱 [IAM 中的暫時安全憑證](id_credentials_temp.md)。在 AWS STS 發出臨時安全憑證後，它們在過期期間有效，且無法撤銷。但是，每次發出使用憑證的請求時，都會評估指派給臨時安全憑證的許可，因此您可以透過在發出憑證後變更其存取權來達到撤銷憑證的效果。

下列主題假設您具備 AWS 許可和政策的工作知識。如需有關這些主題的詳細資訊，請參閱 [AWS 資源的存取管理](access.md)。

**Topics**
+ [AssumeRole、AssumeRoleWithSAML 和 AssumeRoleWithWebIdentity 的許可](id_credentials_temp_control-access_assumerole.md)
+ [監控並控制使用擔任角色所採取的動作](id_credentials_temp_control-access_monitor.md)
+ [GetFederationToken 許可](id_credentials_temp_control-access_getfederationtoken.md)
+ [GetSessionToken 許可](id_credentials_temp_control-access_getsessiontoken.md)
+ [停用臨時安全性憑證的許可](id_credentials_temp_control-access_disable-perms.md)
+ [授予許可以建立暫時性安全憑證](id_credentials_temp_control-access_enable-create.md)
+ [授予許可以使用身分增強型主控台工作階段](id_credentials_temp_control-access_sts-setcontext.md)

# AssumeRole、AssumeRoleWithSAML 和 AssumeRoleWithWebIdentity 的許可
<a name="id_credentials_temp_control-access_assumerole"></a>

所擔任角色的許可政策，將會決定由 `AssumeRole`、`AssumeRoleWithSAML` 和 `AssumeRoleWithWebIdentity` 傳回的臨時安全憑證的許可。當您建立或更新角色時定義這些許可。

或者，您可以傳遞內嵌或受管的[工作階段政策](access_policies.md#policies_session)作為 `AssumeRole`、`AssumeRoleWithSAML` 或 `AssumeRoleWithWebIdentity` API 操作的參數。工作階段政策會為該角色的臨時憑證工作階段限制許可。所產生工作階段的許可會是角色的身分類型政策和工作階段政策的交集。您可以在後續 AWS API 呼叫中使用角色的臨時登入資料，來存取擁有該角色之帳戶中的資源。您無法使用工作階段政策來授予超出即將擔任角色之以身分為基礎政策所允許的許可。若要進一步了解 AWS 如何決定角色的有效許可，請參閱[政策評估邏輯](reference_policies_evaluation-logic.md)。

![\[PermissionsWhenPassingRoles_Diagram\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/role_passed_policy_permissions.png)


進行「允許」或「拒絕」授權決策 AWS 時， `AssumeRole` 不會評估連接至發出原始呼叫之登入資料的 政策。使用者暫時放棄其原始許可，以支援由擔任角色指派的許可。在 `AssumeRoleWithSAML`和 `AssumeRoleWithWebIdentity` API 操作中，由於 API 的發起人不是 AWS 身分，因此沒有要評估的政策。

## 範例：使用 AssumeRole 指派許可
<a name="permissions-assume-role-example"></a>

您可以將 `AssumeRole` API 操作與不同類型的政策一起使用。以下是幾個範例。

### 角色許可政策
<a name="permissions-assume-role-example-role-access-policy"></a>

在此範例中，您在呼叫 `AssumeRole` API 操作時未使用選用 `Policy` 參數來指定工作階段。指派給臨時憑證的許可由所擔任角色的許可政策決定。以下範例許可政策授予角色許可，以列出名為 `productionapp` 的 S3 儲存貯體中包含的所有物件。它還允許角色取得、放置和刪除該儲存貯體中的物件。

**Example 角色許可政策範例**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::productionapp"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject"
      ],
      "Resource": "arn:aws:s3:::productionapp/*"
    }
  ]
}
```

### 工作階段政策作為參數傳遞
<a name="permissions-assume-role-example-passed-policy"></a>

假設您想要讓使用者擔任與上一個範例相同的角色。但是，此時您希望該角色工作階段擁有的許可，只允許其取得 `productionapp` S3 儲存貯體中的物件，以及在其中放入物件。您不想讓他們刪除物件。實現此目的一種方法是建立新的角色並在該角色的許可政策中指定所需許可。實現此目的之另一種方法是呼叫 `AssumeRole` API，並將工作階段政策包含在可選的 `Policy` 參數做為 API 操作的一部分。所產生工作階段的許可會是角色的以身分為基礎的政策和工作階段政策的交集。工作階段政策不能用來授予超出即將擔任角色之以身分為基礎政策所允許的許可。如需有關角色工作階段許可的詳細資訊，請參閱 [工作階段政策](access_policies.md#policies_session)。

擷取新的工作階段臨時憑證後，您可以將這些資料傳遞給您希望擁有這些許可的使用者。

例如，假設以下政策做為 API 呼叫的參數傳遞。使用這項工作階段的人員所擁有的許可，將僅能執行下列動作：
+ 列出 `productionapp` 儲存貯體中的所有物件。
+ 取得並將物件放入 `productionapp` 儲存貯體中。

在以下工作階段政策中，`s3:DeleteObject` 許可會遭篩除，而且擔任的工作階段不會獲得 `s3:DeleteObject` 許可的授予。此政策設定角色工作階段的最大許可，並供以覆寫該角色的任何現有許可政策。

**Example 工作階段使用`AssumeRole` API 呼叫傳遞政策範例**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::productionapp"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Resource": "arn:aws:s3:::productionapp/*"
    }
  ]
}
```

### 以資源為基礎的政策
<a name="permissions-assume-role-example-resource-based-policy"></a>

有些 AWS 資源支援以資源為基礎的政策，這些政策提供另一個機制來定義影響臨時安全登入資料的許可。只有少數資源 (例如 Amazon S3 儲存貯體、Amazon SNS 主題和 Amazon SQS 佇列) 支援資源式政策。以下範例使用名為 `productionapp` 的 S3 儲存貯體擴展前面的範例。以下政策連接至儲存貯體。

當您將下面以資源為基礎的政策連接到 `productionapp` 儲存貯體時，將拒絕*所有*使用者從儲存貯體中刪除物件的許可。(請參閱政策中的 `Principal` 元素。) 這包括所有擔任角色使用者，即使角色許可政策授予 `DeleteObject` 許可。明確 `Deny` 陳述式一律優先於 `Allow` 陳述式。

**Example 儲存貯體政策的範例**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Principal": {"AWS": "*"},
    "Effect": "Deny",
    "Action": "s3:DeleteObject",
    "Resource": "arn:aws:s3:::productionapp/*"
  }
}
```

如需如何合併和評估多個政策類型的詳細資訊 AWS，請參閱 [政策評估邏輯](reference_policies_evaluation-logic.md)。

# 監控並控制使用擔任角色所採取的動作
<a name="id_credentials_temp_control-access_monitor"></a>

[IAM 角色](id_roles.md)是 IAM 中受指派[許可](access_policies.md)的物件。當您使用來自 外部的 IAM 身分或身分[擔任該角色](id_roles_manage-assume.md)時 AWS，您會收到具有指派給該角色之許可的工作階段。

當您在 中執行動作時 AWS，您的工作階段相關資訊可以記錄到 AWS CloudTrail ，以供帳戶管理員監控。管理員可以將角色設定為要求身分傳遞自訂字串，以識別在 AWS中執行動作的人員或應用程式。此身分資訊會儲存為 AWS CloudTrail中的*來源身分*。當管理員查看 CloudTrail 中的活動時，他們可以查看來源身分資訊以判斷曾使用擔任角色工作階段執行動作者。

設定來源身分後，它會出現在角色工作階段期間所採取任何 AWS 動作的請求中。當角色用於透過 AWS CLI 或 AWS API 擔任另一個角色時，設定的 值會持續存在，稱為[角色鏈結](id_roles.md#iam-term-role-chaining)。設定的值無法在角色工作階段期間變更。管理員可以根據來源身分的存在或值來設定精細許可，以進一步控制使用共用角色採取 AWS 的動作。您可以決定是否可以使用來源身分屬性、是否需要，以及可以使用的數值。



您使用來源身分的方式與角色工作階段名稱和工作階段標記有很大的不同。來源身分值在設定之後即無法變更，而且對於對角色工作階段採取的任何其他動作，會持續存在。以下說明如何使用工作階段標籤和角色工作階段名稱：
+ **工作階段標籤** – 您也可以在擔任角色或與使用者聯合身分時傳遞工作階段標籤。擔任角色時，工作階段標籤即會出現。您可以定義使用標籤條件金鑰的政策，以根據主體的標籤來授與許可。您可以使用 CloudTrail 來檢視為了擔任角色或聯合身分使用者而提出的請求。若要進一步了解工作階段標籤，請參閱 [在 中傳遞工作階段標籤 AWS STS](id_session-tags.md)。
+ **角色工作階段名稱** – 您可以在角色信任政策中使用 `sts:RoleSessionName` 條件金鑰，請求您的使用者在擔任角色時提供特定的工作階段名稱。當不同主體使用角色時，角色工作階段名稱可用來區分角色工作階段。若要進一步了解角色工作階段名稱，請參閱 [sts:RoleSessionName](reference_policies_iam-condition-keys.md#ck_rolesessionname)。

當您想要控制擔任角色的身分時，建議您使用來源身分。對於挖掘 CloudTrail 日誌以判斷使用角色來執行動作的人員時，來源身分也示非常實用的資訊。

**Topics**
+ [設定以使用來源身分](#id_credentials_temp_control-access_monitor-setup)
+ [來源身分的須知事項](#id_credentials_temp_control-access_monitor-know)
+ [設定來源身分所需的許可](#id_credentials_temp_control-access_monitor-perms)
+ [擔任角色時指定來源身分](#id_credentials_temp_control-access_monitor-specify-sourceid)
+ [搭配 AssumeRole 使用來源身分](#id_credentials_temp_control-access_monitor-assume-role)
+ [將來源身分與 AssumeRoleWithSAML 搭配使用](#id_credentials_temp_control-access_monitor-assume-role-saml)
+ [使用具有 AssumeRoleWithWebIdentity 的來源身分](#id_credentials_temp_control-access_monitor-assume-role-web-id)
+ [使用來源身分資訊控制存取](#id_credentials_temp_control-access_monitor-control-access)
+ [在 CloudTrail 中檢視來源身分](#id_credentials_temp_control-access_monitor-ct)

## 設定以使用來源身分
<a name="id_credentials_temp_control-access_monitor-setup"></a>

您設定為使用來源身分的方式將取決於擔任角色時所使用的方法。例如，您的 IAM 使用者可能會直接使用 `AssumeRole` 操作擔任角色。如果您有企業身分，也稱為人力身分，他們可能會使用 存取您的 AWS 資源`AssumeRoleWithSAML`。如果最終使用者要存取您的行動或 Web 應用程式，他們可能會使用 `AssumeRoleWithWebIdentity` 來存取。以下是高階工作流程概觀，可協助您瞭解如何設定以利用現有環境中的來源身分資訊。

1. **設定測試使用者和角色** – 使用生產前環境，設定測試使用者和角色，並設定其政策以允許設定來源身分。

   如果您使用身分提供者 (IdP) 作為聯合身分，請將 IdP 設定為將您選擇的使用者屬性傳遞至聲明或權杖中的來源身分。

1. **擔任角色** – 測試擔任角色，並使用您設定要進行測試的使用者和角色傳遞來源身分。

1. **檢視 CloudTrail** – 檢閱 CloudTrail 日誌中測試角色的來源身分資訊。

1. **培訓您的使用者** – 在生產前環境中進行測試之後，請確保您的使用者知道如何傳入來源身分資訊 (如有必要)。設定您要求使用者在生產環境中提供來源身分的截止日期。

1. **設定生產政策** – 為您的生產環境設定政策，然後將政策新增至您的生產使用者和角色。

1. **監控活動** – 使用 CloudTrail 日誌來監控您的生產角色活動。

## 來源身分的須知事項
<a name="id_credentials_temp_control-access_monitor-know"></a>

使用來源身分時請記住下列事項。
+ 連線至身分提供者 (IdP) 之所有角色的信任政策均須具有 `sts:SetSourceIdentity` 許可。對於角色信任政策中沒有此許可的角色，`AssumeRole*` 操作將會失敗。如果您不想更新每個角色的角色信任政策，則您可以使用個別的 IdP 執行個體傳遞來源身分。然後將 `sts:SetSourceIdentity` 許可僅新增至連線至個別 IdP 的角色。
+ 當身分設定來源身分時，`sts:SourceIdentity` 金鑰會存在於請求中。針對在角色工作階段期間採取的後續動作，`aws:SourceIdentity` 金鑰會出現在請求中。 AWS 不會在 `sts:SourceIdentity` 或 `aws:SourceIdentity` 金鑰中控制來源身分的值。如果您選擇要求來源身分，則必須選擇要讓使用者或 IdP 提供的屬性。基於安全考量，您必須確保您可以控制提供這些值的方式。
+ 來源身分中的值長度必須介於 2 到 64 個字元之間，只能包含字母數位字元、底線和以下字元：**. , \$1 = @ -** (連字號)。您不能使用以文字 **aws:** 為開頭的值。此字首保留供 AWS 內部使用。
+ 當 AWS 服務或服務連結角色代表聯合身分或人力資源身分執行動作時，CloudTrail 不會擷取來源身分資訊。

**重要**  
您無法在 中切換到在擔任角色時 AWS 管理主控台 需要設定來源身分的角色。若要擔任這類角色，您可以使用 AWS CLI 或 AWS API 來呼叫 `AssumeRole`操作，並指定來源身分參數。

## 設定來源身分所需的許可
<a name="id_credentials_temp_control-access_monitor-perms"></a>

除了符合 API 操作的動作外，您必須在您的政策中具備下列僅許可動作：

```
sts:SetSourceIdentity
```
+ 若要指定來源身分，主體 (IAM 使用者和角色) 必須具有 `sts:SetSourceIdentity` 的許可。身為系統管理員，您可以在角色信任政策和主體的權限政策中設定此選項。
+ 當您擔任另一個角色的角色時，稱為[角色鏈結](id_roles.md#iam-term-role-chaining)，在主體 (擔任角色) 的許可政策和目標角色的角色信任政策中都需要 `sts:SetSourceIdentity` 的許可。否則，擔任角色操作將會失敗。
+ 使用來源身分時，連線至 IdP 之所有角色的角色信任政策必須具有 `sts:SetSourceIdentity` 許可。任何連接至 IdP 的角色，在沒有此許可的情況下，`AssumeRole*` 操作將會失敗。如果您不想更新每個角色的角色信任政策，則您可以使用個別的 IdP 執行個體傳遞來源身分，然後將 `sts:SetSourceIdentity` 許可僅新增至連線至個別 IdP 的角色
+ 若要跨帳戶界限設定來源身分，您必須在兩個地方均包含 `sts:SetSourceIdentity` 許可。此許可必須存在於原始帳戶中主體的許可政策，以及目標帳戶中角色的角色信任政策。您可能需要執行此操作，例如，當一個角色被用來在另一個具有[角色鏈結](id_roles.md#iam-term-role-chaining)的帳戶中擔任一個角色時。

身為帳戶管理員，假設您想要允許您帳戶中的 IAM 使用者 `DevUser` 在同一個帳戶中擔任 `Developer_Role`。但是，您希望只有在使用者已將來源身分設定為其 IAM 使用者名稱時，才允許此動作。您可將下列政策連接至 IAM 使用者。

**Example 連接至 DevUser 的以身分為基礎的政策範例**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AssumeRole",
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::123456789012:role/Developer_Role"
    },
    {
      "Sid": "SetAwsUserNameAsSourceIdentity",
      "Effect": "Allow",
      "Action": "sts:SetSourceIdentity",
      "Resource": "arn:aws:iam::123456789012:role/Developer_Role",
      "Condition": {
        "StringLike": {
          "sts:SourceIdentity": "${aws:username}"
        }
      }
    }
  ]
}
```

若要強制執行可接受的來源身分值，您可以設定下列角色信任政策。政策會為 IAM 使用者提供`DevUser`許可來擔任角色並設定來源身分。`sts:SourceIdentity` 條件索引鍵定義了可接受的來源身分值。

**Example 來源身分的角色信任政策範例**  

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowDevUserAssumeRole",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:user/DevUser"
      },
      "Action": [
        "sts:AssumeRole",
        "sts:SetSourceIdentity"
      ],
      "Condition": {
        "StringEquals": {
          "sts:SourceIdentity": "DevUser"
        }
      }
    }
  ]
}
```

------

使用者使用 IAM 使用者的登入資料 `DevUser`，嘗試`DeveloperRole`使用以下 AWS CLI 請求擔任 。

**Example AssumeRole CLI 請求範例**  

```
aws sts assume-role \
--role-arn arn:aws:iam::123456789012:role/Developer_Role \
--role-session-name Dev-project \ 
--source-identity DevUser \
```

當 AWS 評估請求時，請求內容會包含 `sts:SourceIdentity`的 `DevUser`。

## 擔任角色時指定來源身分
<a name="id_credentials_temp_control-access_monitor-specify-sourceid"></a>

當您使用其中一個 AWS STS `AssumeRole*` API 操作來取得角色的臨時安全登入資料時，可以指定來源身分。您使用的 API 操作會視您的使用案例而有所不同。例如，如果您使用 IAM 角色讓 IAM 使用者存取他們通常無法存取 AWS 的資源，您可以使用 `AssumeRole`操作。如果您使用企業聯合身分來管理人力使用者，可以使用 `AssumeRoleWithSAML` 操作。如果您使用 OIDC 聯合身分來允許最終使用者存取您的行動裝置或 Web 應用程式，則可以使用 `AssumeRoleWithWebIdentity` 操作。以下各節說明如何在每項操作中使用來源身分。若要進一步了解暫時憑證的常見案例，請參閱[暫時性憑證的常見案例](id_credentials_temp.md#sts-introduction)。

## 搭配 AssumeRole 使用來源身分
<a name="id_credentials_temp_control-access_monitor-assume-role"></a>

`AssumeRole` 操作會傳回一組臨時登入資料，您可用來存取 AWS 資源。您可以使用 IAM 使用者或角色憑證來呼叫 `AssumeRole`。若要在擔任角色時傳遞來源身分，請使用 `-–source-identity` AWS CLI 選項或 `SourceIdentity` AWS API 參數。以下範例顯示如何使用 AWS CLI來指定來源身分。

**Example AssumeRole CLI 請求範例**  

```
aws sts assume-role \
--role-arn arn:aws:iam::123456789012:role/developer \
--role-session-name Audit \ 
--source-identity Admin \
```

## 將來源身分與 AssumeRoleWithSAML 搭配使用
<a name="id_credentials_temp_control-access_monitor-assume-role-saml"></a>

主體呼叫 `AssumeRoleWithSAML` 操作是使用 SAML 類型的聯合進行身分驗證。此操作會傳回一組臨時登入資料，您可以用來存取 AWS 資源。如需使用 SAML 型聯合進行 AWS 管理主控台 存取的詳細資訊，請參閱 [啟用 SAML 2.0 聯合主體來存取 AWS 管理主控台](id_roles_providers_enable-console-saml.md)。如需 AWS CLI 或 AWS API 存取的詳細資訊，請參閱 [SAML 2.0 聯合身分](id_roles_providers_saml.md)。如需為 Active Directory 使用者設定 SAML 聯合的教學課程，請參閱 AWS 安全部落格中的[AWS 使用 Active Directory 聯合服務 (ADFS) 進行聯合身分驗證](https://aws.amazon.com/blogs/security/aws-federated-authentication-with-active-directory-federation-services-ad-fs/)。

身為管理員，您可以允許公司目錄的成員 AWS 使用 AWS STS `AssumeRoleWithSAML`操作聯合到 。若要執行此操作，您必須完成下列任務：

1. [在組織中設定 SAML 提供者](id_roles_providers_saml_3rd-party.md)。

1. [在 IAM 中建立 SAML 提供者](id_roles_providers_create_saml.md)

1. 在 [中 AWS 為您的 SAML 聯合委託人設定角色及其許可](id_roles_create_for-idp_saml.md)。

1. [完成配置 SAML IdP 並為 SAML 身分驗證回應建立聲明](id_roles_providers_create_saml_assertions.md)。

若要設定來源身分的 SAML 屬性，請包含 `Attribute` 元素與設定為 `https://aws.amazon.com/SAML/Attributes/SourceIdentity` 的 `Name` 屬性。使用 `AttributeValue` 元素指定來源身分的值。例如，假設您希望將下列身分屬性作為來源身分傳遞。

`SourceIdentity:DiegoRamirez`

如要傳遞此屬性，請在您的 SAML 聲明中包含下列元素。

**Example SAML 聲明的程式碼片段範例**  

```
<Attribute Name="https://aws.amazon.com/SAML/Attributes/SourceIdentity">
<AttributeValue>DiegoRamirez</AttributeValue>
</Attribute>
```

## 使用具有 AssumeRoleWithWebIdentity 的來源身分
<a name="id_credentials_temp_control-access_monitor-assume-role-web-id"></a>

主體呼叫 `AssumeRoleWithWebIdentity` 操作是使用與 OpenID Connect (OIDC) 相容的聯合身分進行身分驗證。此操作會傳回一組暫時憑證，讓您用來存取 AWS 資源。如需有關使用 OIDC 聯合身分以存取 AWS 管理主控台 的資訊，請參閱 [OIDC 聯合身分](id_roles_providers_oidc.md)。

若要從 OpenID Connect (OIDC) 傳遞來源身分，您必須在 JSON Web 權杖 (JWT) 中包含來源身分。在您提交 `AssumeRoleWithWebIdentity` 請求時，您必須在權杖中的 `[https://aws.amazon.com/](https://aws.amazon.com/)source_identity` 命名空間內包含來源身分。若要進一步了解 OIDC 權杖和要求，請參閱《Amazon Cognito 開發人員指南》**中的[搭配使用者集區使用權杖](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html)。

例如，以下解碼後的 JWT 是搭配 `Admin` 來源身分呼叫 `AssumeRoleWithWebIdentity` 的權杖。

**Example 解碼後的 JSON Web 權杖範例**  

```
{
    "sub": "john",
    "aud": "ac_oic_client",
    "jti": "ZYUCeRMQVtqHypVPWAN3VB",
    "iss": "https://xyz.com",
    "iat": 1566583294,
    "exp": 1566583354,
    "auth_time": 1566583292,
    "https://aws.amazon.com/source_identity":"Admin"
}
```

## 使用來源身分資訊控制存取
<a name="id_credentials_temp_control-access_monitor-control-access"></a>

初始設定來源身分時，[sts:SourceIdentity](reference_policies_iam-condition-keys.md#ck_sourceidentity) 金鑰會出現在請求中。設定來源身分之後，[aws:SourceIdentity](reference_policies_condition-keys.md#condition-keys-sourceidentity) 金鑰會存在於角色工作階段期間所提出的所有後續請求中。身為管理員，您可以撰寫政策，根據來源身分屬性的存在或值授予條件式授權來執行 AWS 動作。

假設您想要要求開發人員設定來源身分，以擔任具有寫入生產關鍵 AWS 資源許可的關鍵角色。也假設您使用 授予對人力資源身分的 AWS 存取權`AssumeRoleWithSAML`。您只希望資深開發人員 Saanvi 和 Diego 能夠存取角色，因此您為該角色建立下列信任政策。

**Example 來源身分的角色信任政策範例 (SAML)**  

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "SAMLProviderAssumeRoleWithSAML",
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::111122223333:saml-provider/name-of-identity-provider"
      },
      "Action": [
        "sts:AssumeRoleWithSAML"
      ],
      "Condition": {
        "StringEquals": {
          "SAML:aud": "https://signin.aws.amazon.com/saml"
        }
      }
    },
    {
      "Sid": "SetSourceIdentitySrEngs",
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::111122223333:saml-provider/name-of-identity-provider"
      },
      "Action": [
        "sts:SetSourceIdentity"
      ],
      "Condition": {
        "StringLike": {
          "sts:SourceIdentity": [
            "Saanvi",
            "Diego"
          ]
        }
      }
    }
  ]
}
```

------

信任政策包含 `sts:SourceIdentity` 的條件，需要 Saanvi 或 Diego 的來源身分，才能擔任關鍵角色。

或者，如果您使用 OIDC 提供者作為聯合身分，且使用者已透過 `AssumeRoleWithWebIdentity` 驗證身分，則您的角色信任政策可能如下所示。

**Example 來源身分的角色信任政策範例 (OIDC 提供者)**  

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::111122223333:oidc-provider/server.example.com"
      },
      "Action": [
        "sts:AssumeRoleWithWebIdentity",
        "sts:SetSourceIdentity"
      ],
      "Condition": {
        "StringEquals": {
          "server.example.com:aud": "oidc-audience-id"
        },
        "StringLike": {
          "sts:SourceIdentity": [
            "Saanvi",
            "Diego"
          ]
        }
      }
    }
  ]
}
```

------

### 角色鏈結和跨帳戶需求
<a name="id_credentials_temp_control-access_monitor-chain"></a>

假設您想允許已擔任 `CriticalRole` 的使用者在另一個帳戶中擔任 `CriticalRole_2`。為擔任 `CriticalRole` 而取得的角色工作階段憑證用於將[角色鏈結](id_roles.md#iam-term-role-chaining)至另一個帳戶中的第二個角色 `CriticalRole_2`。角色是跨帳戶界限擔任。因此，必須在 `CriticalRole` 的許可政策和 `CriticalRole_2` 的角色信任政策中授予 `sts:SetSourceIdentity` 許可。

**Example CriticalRole 上的許可政策範例**  

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AssumeRoleAndSetSourceIdentity",
      "Effect": "Allow",
      "Action": [
        "sts:AssumeRole",
        "sts:SetSourceIdentity"
      ],
      "Resource": "arn:aws:iam::222222222222:role/CriticalRole_2"
    }
  ]
}
```

------

為了確保跨帳戶界限設定來源身分，以下角色信任政策僅信任 `CriticalRole` 的角色主體來設定來源身分。

**Example CriticalRole\$12 上的角色信任政策範例**  

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111111111111:role/CriticalRole"
      },
      "Action": [
        "sts:AssumeRole",
        "sts:SetSourceIdentity"
      ],
      "Condition": {
        "StringLike": {
          "aws:SourceIdentity": ["Saanvi","Diego"]
        }
      }
    }
  ]
}
```

------

使用者使用擔任 CritealRole 所取得的角色工作階段憑證進行下列呼叫。來源身分是在擔任 CrealRole 期間所設定，所以不需要再次明確設定。如果使用者嘗試設定的來源身分與擔任 `CriticalRole` 時設定的值不同，則擔任角色請求將會遭到拒絕。

**Example AssumeRole CLI 請求範例**  

```
aws sts assume-role \ 
--role-arn arn:aws:iam::222222222222:role/CriticalRole_2 \
--role-session-name Audit \
```

當呼叫主體擔任角色時，請求中的來源身分會從第一個擔任角色工作階段開始一直存在。因此，`aws:SourceIdentity` 和 `sts:SourceIdentity` 索引鍵均會出現在請求內容中。

## 在 CloudTrail 中檢視來源身分
<a name="id_credentials_temp_control-access_monitor-ct"></a>

您可以使用 CloudTrail 來檢視為了擔任角色或聯合身分使用者而提出的請求。您也可以檢視角色或使用者請求，以在 AWS中採取行動。CloudTrail 日誌檔案包含經擔任角色或聯合身分使用者工作階段的來源身分設定資訊。如需詳細資訊，請參閱[使用 記錄 IAM 和 AWS STS API 呼叫 AWS CloudTrail](cloudtrail-integration.md)

例如，假設使用者提出 AWS STS `AssumeRole`請求，並設定來源身分。您可以在您的 CloudTrail 日誌的 `requestParameters` 索引鍵中找到 `sourceIdentity` 資訊。

**Example AWS CloudTrail 日誌中的範例 requestParameters 區段**  

```
"eventVersion": "1.05",
    "userIdentity": {
        "type": "AWSAccount",
        "principalId": "AIDAJ45Q7YFFAREXAMPLE",
        "accountId": "111122223333"
    },
    "eventTime": "2020-04-02T18:20:53Z",
    "eventSource": "sts.amazonaws.com",
    "eventName": "AssumeRole",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "203.0.113.64",
    "userAgent": "aws-cli/1.16.96 Python/3.6.0 Windows/10 botocore/1.12.86",
    "requestParameters": {
        "roleArn": "arn:aws:iam::123456789012:role/DevRole",
        "roleSessionName": "Dev1",
        "sourceIdentity": "source-identity-value-set"
    }
```

如果使用者使用擔任的角色工作階段來執行動作，則來源身分資訊會出現在 CloudTrail 日誌的 `userIdentity` 索引鍵中。

**Example AWS CloudTrail 日誌中 userIdentity 金鑰的範例**  

```
{
  "eventVersion": "1.08",
  "userIdentity": {
    "type": "AssumedRole",
    "principalId": "AROAJ45Q7YFFAREXAMPLE:Dev1",
    "arn": "arn:aws:sts::123456789012:assumed-role/DevRole/Dev1",
    "accountId": "123456789012",
    "accessKeyId": "ASIAIOSFODNN7EXAMPLE",
    "sessionContext": {
      "sessionIssuer": {
        "type": "Role",
        "principalId": "AROAJ45Q7YFFAREXAMPLE",
        "arn": "arn:aws:iam::123456789012:role/DevRole",
        "accountId": "123456789012",
        "userName": "DevRole"
      },
      "webIdFederationData": {},
      "attributes": {
        "mfaAuthenticated": "false",
        "creationDate": "2021-02-21T23:46:28Z"
      },
      "sourceIdentity": "source-identity-value-present"
    }
  }
}
```

若要查看 CloudTrail 日誌中的範例 AWS STS API 事件，請參閱 [CloudTrail 日誌中的 IAM API 事件範例](cloudtrail-integration.md#cloudtrail-integration_examples-iam-api)。如需有關 CloudTrail 日誌檔案中包含資訊的詳細資訊，請參閱《AWS CloudTrail 使用者指南》**中的 [CloudTrail 事件參考](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/eventreference.html)。

# GetFederationToken 許可
<a name="id_credentials_temp_control-access_getfederationtoken"></a>

此 `GetFederationToken` 操作是由 IAM 使用者所呼叫並會傳回該使用者的臨時憑證。此操作會*聯合*使用者。指派給 AWS STS 聯合身分使用者工作階段的許可定義在兩個位置之一：
+ 該工作階段政策會以 `GetFederationToken` API 呼叫的參數傳遞。(這是最常見的)。
+ 以資源為基礎的政策，在政策的 `Principal`元素中明確命名 AWS STS 聯合身分使用者工作階段。(這是最少見的)。

工作階段政策是一種進階政策，且您會在以程式設計方式建立臨時工作階段時，以參數方式傳遞此政策。當您建立 AWS STS 聯合身分使用者工作階段並傳遞工作階段政策時，產生的工作階段許可是使用者身分型政策和工作階段政策的交集。您無法使用工作階段政策來授予超出即將聯合使用者之以身分為基礎政策所允許的許可。

在大部分情況下，如果您未通過 `GetFederationToken` API 呼叫的政策，則所產生的暫時安全憑證沒有許可。不過，以資源為基礎的政策可提供該工作階段的額外許可。您可以使用以資源為基礎的政策存取資源，該政策會將您的工作階段指定為允許的主體。

下圖顯示政策互動的視覺化呈現，以判斷對 `GetFederationToken` 呼叫傳回的暫時安全憑證的許可。

![\[IAM 使用者下圖顯示核取記號，指出工作階段許可是使用者身分型政策和工作階段政策的交集。工作階段許可也可以是使用者身分型政策和資源型政策的交集。\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/getfederationtoken-permissions.diagram.png)


## 範例：使用 GetFederationToken 指派許可
<a name="permissions-get-federation-token-example"></a>

您可以將 `GetFederationToken` API 動作與不同類型的政策一起使用。以下是幾個範例。

### 連接至 IAM 使用者的政策
<a name="permissions-get-federation-token-example-iam-user"></a>

在這個範例中，您有一個以瀏覽器為基礎的用戶端應用程式，它依賴於兩個後端的 Web 服務。一個後端服務是您自己的身分驗證伺服器，使用您自己的身分系統來驗證用戶端應用程式。另一個後端服務是 AWS 服務，可提供一些用戶端應用程式的功能。用戶端應用程式由您的伺服器進行身分驗證，您的伺服器會建立或擷取適當的許可政策。然後，您的伺服器呼叫 `GetFederationToken` API 以取得暫時安全憑證，並將這些憑證傳回給用戶端應用程式。然後，用戶端應用程式可以使用臨時安全登入資料直接向 AWS 服務提出請求。此架構可讓用戶端應用程式提出 AWS 請求，而無需內嵌長期 AWS 登入資料。

您的身分驗證伺服器使用名為 `token-app` 之 IAM 使用者的長期安全憑證來呼叫 `GetFederationToken` API。但長期 IAM 使用者憑證會保持在伺服器上且絕對不會發佈到用戶端。下列範例政策會連接至 `token-app` IAM 使用者，並定義 AWS STS 聯合身分使用者 （用戶端） 所需的最廣泛許可集。請注意，您的身分驗證服務需要 `sts:GetFederationToken`許可，才能取得 AWS STS 聯合身分使用者的臨時安全登入資料。

**Example 連接到呼叫 `GetFederationToken` 的 IAM 使用者 `token-app` 的政策範例**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:GetFederationToken",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "dynamodb:ListTables",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "sqs:ReceiveMessage",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "s3:ListBucket",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "sns:ListSubscriptions",
      "Resource": "*"
    }
  ]
}
```

上述政策會將多個許可授予 IAM 使用者。不過，僅此政策不會將任何許可授予 AWS STS 聯合身分使用者。如果此 IAM 使用者呼叫 `GetFederationToken`，且 未將政策作為 API AWS STS 呼叫的參數傳遞，則產生的聯合身分使用者沒有有效的許可。

### 工作階段政策作為參數傳遞
<a name="permissions-get-federation-token-example-passed-policy"></a>

確保 AWS STS 聯合身分使用者獲指派適當許可的最常見方法是在 `GetFederationToken` API 呼叫中傳遞工作階段政策。擴展前面的範例，假設使用 IAM 使用者 `token-app` 憑證來呼叫 `GetFederationToken`。假設以下工作階段政策做為 API 呼叫的參數傳遞。所產生的 AWS STS 聯合身分使用者具有列出名為 `productionapp` 的 Amazon S3 儲存貯體內容的許可。該使用者無法對 `productionapp` 儲存貯體中的項目執行 Amazon S3 `GetObject`、`PutObject` 和 `DeleteObject` 動作。

聯合身分使用者會獲派這些許可，因為這些許可是 IAM 使用者政策和您傳遞之工作階段政策的交集。

 AWS STS 聯合身分使用者無法在 Amazon SNS、Amazon SQS、Amazon DynamoDB 或任何 S3 儲存貯體中執行動作，但 除外`productionapp`。即使這些許可已授予給與 `GetFederationToken` 呼叫相關聯的 IAM 使用者，這些動作仍然會遭到拒絕。

**Example 工作階段政策作為 `GetFederationToken` API 呼叫的參數傳遞範例**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::productionapp"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject"
      ],
      "Resource": ["arn:aws:s3:::productionapp/*"]
    }
  ]
}
```

### 資源型政策
<a name="permissions-get-federation-token-resource-based-policy"></a>

有些 AWS 資源支援以資源為基礎的政策，而這些政策提供另一種機制，可將許可直接授予 AWS STS 聯合身分使用者。只有部分 AWS 服務支援以資源為基礎的政策。例如，Amazon S3 具有儲存貯體，Amazon SNS 具有主題，並且 Amazon SQS 具有可以連接政策的佇列。如需有關支援以資源為基礎的政策的所有服務的清單，請參閱 [AWS 使用 IAM 的 服務](reference_aws-services-that-work-with-iam.md) 並查看表格中的「以資源為基礎的政策」資料列。您可以使用資源型政策，直接將許可指派給 AWS STS 聯合身分使用者。透過在資源型政策的 `Principal`元素中指定 AWS STS 聯合身分使用者的 Amazon Resource Name (ARN) 來執行此操作。以下範例使用名為 `productionapp` 的 S3 儲存貯體說明此範例並擴展前面的範例。

以下以資源為基礎的政策已連接到儲存貯體。此儲存貯體政策允許名為 Carol AWS STS 的聯合身分使用者存取儲存貯體。當前述的範例政策連接至 `token-app` IAM 使用者時，名為 Carol AWS STS 的聯合身分使用者具有許可，可在名為 的儲存貯體上執行 `s3:GetObject`、 `s3:PutObject`和 `s3:DeleteObject`動作`productionapp`。即使沒有工作階段政策做為 `GetFederationToken` API 呼叫的參數傳遞時，也是如此。這是因為在此案例中，名為 Carol AWS STS 的聯合身分使用者已由下列以資源為基礎的政策明確授予許可。

請記住，只有當 AWS STS 這些許可同時明確授予 IAM 使用者***和***聯合身分使用者時， AWS STS 才會授予聯合身分使用者許可。也可以由以資源為基礎的政策授予 （在帳戶中），該政策在政策的 AWS STS `Principal`元素中明確命名聯合身分使用者，如下列範例所示。

**Example 允許存取聯合身分使用者的儲存貯體政策範例**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Principal": {
            "AWS": "arn:aws:sts::111122223333:federated-user/Carol"
        },
        "Effect": "Allow",
        "Action": [
            "s3:GetObject",
            "s3:PutObject",
            "s3:DeleteObject"
        ],
        "Resource": [
            "arn:aws:s3:::productionapp/*"
        ]
    }
}
```

如需有關如何評估政策的詳細資訊，請參閱[政策評估邏輯](reference_policies_evaluation-logic.md)。

# GetSessionToken 許可
<a name="id_credentials_temp_control-access_getsessiontoken"></a>

呼叫 `GetSessionToken` API 操作或 `get-session-token` CLI 命令的主要時間是，當使用者必須透過多重要素驗證 (MFA) 進行身分驗證時。可以編寫只允許特定操作的一項政策，且只有在這些操作是由經過 MFA 身分驗證的使用者提出的請求時，才允許執行。為成功通過 MFA 身分驗證檢查，使用者必須先呼叫 `GetSessionToken`，並且包含可選的`SerialNumber` 和 `TokenCode` 參數。如果使用者成功通過 MFA 裝置身分驗證，`GetSessionToken` API 操作傳回的憑證包含 MFA 內容。此內容表示使用者通過 MFA 身分驗證，並且獲得 API 操作授權，其需要 MFA 身分驗證。

## GetSessionToken 需要的許可
<a name="getsessiontoken-permissions-required"></a>

使用者要取得工作階段權杖並不需要許可。`GetSessionToken` 操作的目的是使用 MFA 驗證使用者的身分。您不能使用政策來控制驗證操作。

若要授予執行大部分 AWS 操作的許可，請將具有相同名稱的動作新增至政策。例如，若要建立使用者，您必須使用 `CreateUser` API 操作、`create-user` CLI 命令或 AWS 管理主控台。若要執行這些操作，您必須擁有一個政策，其可讓您存取 `CreateUser` 動作。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "iam:CreateUser",
            "Resource": "*"
        }
    ]
}
```

------

您可以在您的政策中包含 `GetSessionToken` 動作，但不會影響使用者執行 `GetSessionToken` 操作的能力。

## GetSessionToken 授予的許可
<a name="getsessiontoken-permissions-granted"></a>

如果使用 IAM 使用者的憑證呼叫 `GetSessionToken`，臨時安全性憑證與 IAM 使用者會有相同的許可。同樣地，如果 使用 AWS 帳戶根使用者 登入資料`GetSessionToken`呼叫 ，則暫時安全登入資料具有根使用者許可。

**注意**  
我們建議您不要使用根使用者憑證呼叫 `GetSessionToken`。相反的，請遵循我們的[最佳實務](best-practices-use-cases.md)，並建立具有所需許可的 IAM 使用者。然後，使用這些 IAM 使用者與 進行日常互動 AWS。

當您呼叫 `GetSessionToken` 時您獲得的臨時憑證有下列功能和限制：
+ 您可以使用登入資料來存取 ， AWS 管理主控台 方法是將登入資料傳遞至位於 的聯合單一登入端點`https://signin.aws.amazon.com/federation`。如需詳細資訊，請參閱[啟用 AWS 主控台的自訂身分代理程式存取](id_roles_providers_enable-console-custom-url.md)。
+ 您**無法**使用憑證來呼叫 IAM 或 AWS STS API 操作。**您可以使用**它們來呼叫其他服務的 API 操作 AWS 。

將此 API 操作和其限制及功能與在 [比較 AWS STS 登入資料](id_credentials_sts-comparison.md) 建立臨時安全性憑證的 API 操作相較

如需有關使用 `GetSessionToken` 的受 MFA 保護之 API 存取的詳細資訊，請參閱 [透過 MFA 實現安全的 API 存取](id_credentials_mfa_configure-api-require.md)。

# 停用臨時安全性憑證的許可
<a name="id_credentials_temp_control-access_disable-perms"></a>

暫時安全憑證在過期之前持續有效。這些憑證在指定的持續時間內有效，從 900 秒 (15 分鐘) 至最長 129,600 秒 (36 小時)。預設工作階段持續時間為 43,200 秒 (12 小時)。您可以撤銷這些憑證，但也必須變更 IAM 使用者或角色的許可，以停止使用遭洩漏的憑證進行惡意帳戶活動。每次使用指派給臨時安全登入資料的許可來提出 AWS 請求時，都會進行評估。從登入資料中移除所有許可後，使用它們的 AWS 請求會失敗。

政策更新可能需要幾分鐘的時間才會生效。對於 IAM 角色工作階段，您可以撤銷角色的臨時安全憑證，以強制所有擔任該角色的使用者重新驗證並請求新的憑證。如需詳細資訊，請參閱[撤銷角色的臨時安全憑證](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_revoke-sessions.html)。

您無法變更 的許可 AWS 帳戶根使用者。同樣地，以根使用者身分登入時，您無法更改呼叫 `GetFederationToken` 或 `GetSessionToken` 建立的暫時安全憑證許可。因此，我們建議您不要以根使用者身分呼叫 `GetFederationToken` 或 `GetSessionToken`。

如需有關如何變更 IAM 使用者的許可的程序，請參閱[變更 IAM 使用者的許可](id_users_change-permissions.md)。

如需有關如何變更 IAM 角色的許可的程序，請參閱[更新角色的許可](id_roles_update-role-permissions.md)。

**重要**  
您無法在 IAM 中編輯從 IAM Identity Center 許可集建立的角色。您必須撤銷 IAM Identity Center 中使用者的作用中許可集工作階段。如需詳細資訊，請參閱 *IAM Identity Center User Guide* 中的 [Revoke active IAM role sessions created by permission sets](https://docs.aws.amazon.com/singlesignon/latest/userguide/useraccess.html#revoke-user-permissions)。

**Topics**
+ [拒絕存取與角色關聯的所有 IAM 角色工作階段](#deny-access-to-all-sessions)
+ [拒絕存取特定 IAM 角色工作階段](#deny-access-to-specific-session)
+ [拒絕存取具有條件內容索引鍵的臨時安全憑證工作階段](#deny-access-to-specific-session-condition-key)
+ [使用資源型政策拒絕存取特定主體](#deny-access-with-resource-based)

## 拒絕存取與角色關聯的所有 IAM 角色工作階段
<a name="deny-access-to-all-sessions"></a>

此程序拒絕與角色關聯的**所有** IAM 角色工作階段的許可。當您擔心被以下身分進行可疑存取時，請使用此方法：


+ 使用跨帳戶存取權的其他帳戶中的主體
+ 具有存取您帳戶中 AWS 資源許可的外部使用者身分
+ 在行動或 Web 應用程式中，已透過 OIDC 提供者驗證的使用者

若要變更或移除透過呼叫 `AssumeRole`、`AssumeRoleWithSAML`、`AssumeRoleWithWebIdentity`、`GetFederationToken` 或 `GetSessionToken` 而取得的指派給臨時安全憑證的許可，您可以編輯或刪除為角色定義許可的身分型政策。

**重要**  
如果存在允許主體存取的以資源為基礎的政策，您還必須為該資源新增明確拒絕。如需詳細資訊，請參閱 [使用資源型政策拒絕存取特定主體](#deny-access-with-resource-based)。

**若要拒絕存取與角色關聯的**所有** IAM 角色工作階段**

1. 登入 AWS 管理主控台 並開啟 IAM 主控台。

1. 在導覽窗格中，選擇**角色**。

1. 選擇要編輯的角色名稱。您可以使用搜尋方塊來篩選清單。

1. 選擇**許可**索引標籤。

1. 選取要編輯的相關政策。在編輯客戶管理政策之前，檢閱**連接的實體**索引標籤，以避免中斷對可能已連接相同政策的其他身分的存取。

1. 選擇 **JSON** 標籤並更新政策以拒絕所有資源和動作。
**注意**  
這些許可與 AWS 受管政策 [AWSDenyAll](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSDenyAll.html) 中的許可相同。您可以將此 AWS 受管政策連接至您想要拒絕所有存取的任何 IAM 使用者或角色。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "DenyAll",
               "Effect": "Deny",
               "Action": [
                   "*"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

1. 在 **Review** (檢視) 頁面上，查看政策 **Summary** (摘要)，然後選擇 **Save changes** (儲存政策) 以儲存您的工作。

在更新政策時，所做出的變更將影響與該角色關聯的所有暫時安全憑證的許可，包括在更改該角色的許可政策之前發行的憑證。

更新政策之後，您可以[撤銷角色的暫時安全憑證](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_revoke-sessions.html)以立即撤銷角色所發行憑證的所有許可。

## 拒絕存取特定 IAM 角色工作階段
<a name="deny-access-to-specific-session"></a>

當您使用全部拒絕政策更新 IAM 角色或完全刪除該角色時，有權存取該角色的所有使用者都會中斷。您可以拒絕存取，而不會影響與該角色關聯的所有其他工作階段的許可。

您可以使用[條件內容索引鍵](#deny-access-to-specific-session-condition-key)或[以資源為基礎的政策](#deny-access-with-resource-based)拒絕 `Principal` 的許可。

**提示**  
您可以使用 AWS CloudTrail 日誌來尋找聯合身分使用者的 ARNs。如需詳細資訊，請參閱[如何使用 輕鬆識別您的聯合身分使用者 AWS CloudTrail](https://aws.amazon.com/blogs/security/how-to-easily-identify-your-federated-users-by-using-aws-cloudtrail/)。

## 拒絕存取具有條件內容索引鍵的臨時安全憑證工作階段
<a name="deny-access-to-specific-session-condition-key"></a>

您可以在想要拒絕存取特定臨時安全憑證工作階段的情況下使用身分型政策中的條件內容索引鍵，而不影響建立憑證的 IAM 使用者或角色的許可。對於 IAM 角色，在更新政策之後，您還可以[撤銷角色的臨時安全憑證](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_revoke-sessions.html)工作階段，以立即撤銷所有發行的憑證。

如需條件內容索引鍵的詳細資訊，請參閱 [AWS 全域條件內容索引鍵](reference_policies_condition-keys.md)。

### aws:PrincipalArn
<a name="deny-access-condition-key-principalarn"></a>

您可以在身分型政策中使用條件內容索引鍵 [aws:PrincipalArn](reference_policies_condition-keys.md#condition-keys-principalarn)，依 Amazon Resource Name (ARN) 拒絕存取特定主體。您可以透過在政策的條件元素中指定暫時安全登入資料與之關聯的 AWS STS IAM 使用者、角色或聯合身分使用者工作階段的 ARN 來執行此操作。

**若要依 ARN 拒絕存取特定主體**

1. 在 IAM 主控台導覽窗格中，選擇**使用者**或**角色**。

1. 選擇要編輯的 IAM 使用者或角色的名稱。您可以使用搜尋方塊來篩選清單。

1. 選擇**許可**索引標籤。

1. 選取要編輯的相關政策。在編輯客戶管理政策之前，檢閱**連接的實體**索引標籤，以避免中斷對可能已連接相同政策的其他身分的存取。

1. 選擇 **JSON** 標籤並為主體 ARN 新增拒絕陳述式，如下列範例所示。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Deny",
         "Action": "*",
         "Resource": "*",
         "Condition": {
           "ArnEquals": {
             "aws:PrincipalArn": [
               "arn:aws:iam::222222222222:role/ROLENAME",
               "arn:aws:iam::222222222222:user/USERNAME",
               "arn:aws:iam::222222222222:federated-user/USERNAME" 
             ]
           }
         }
       }
     ]
   }
   ```

------

1. 在 **Review** (檢視) 頁面上，查看政策 **Summary** (摘要)，然後選擇 **Save changes** (儲存政策) 以儲存您的工作。

### aws:SourceIdentity
<a name="deny-access-condition-key-sourceidentity"></a>

您可以在身分型政策中使用條件內容索引鍵 [aws:SourceIdentity](reference_policies_condition-keys.md#condition-keys-sourceidentity)，拒絕存取與 IAM 角色工作階段關聯的特定來源身分。只要角色工作階段是在委託人使用任何 AWS STS `assume-role`\$1 CLI 命令或 AWS STS `AssumeRole`\$1 API 操作擔任角色時，透過設定`SourceIdentity`請求參數發出，就會套用。您可以透過在政策的 `Condition` 元素中指定臨時安全憑證關聯的來源身分來執行此操作。

與內容索引鍵 [sts:RoleSessionName](reference_policies_iam-condition-keys.md#ck_rolesessionname) 不同，在設定來源身分之後，無法變更值。`aws:SourceIdentity` 索引鍵會出現在由角色所採取的所有動作的請求內容中。當您使用工作階段憑證來擔任另一個角色時，來源身分仍然存在於後續角色工作階段。從另一個角色取得及擔任角色稱為[角色鏈結](id_roles.md#iam-term-role-chaining)。

下列政策顯示如何使用條件內容索引鍵 `aws:SourceIdentity` 拒絕存取暫時安全憑證工作階段的範例。如果您指定與角色工作階段關聯的來源身分，則它會拒絕含有具名來源身分的角色工作階段，而不會影響建立憑證的角色的許可。在此範例中，發出角色工作階段時，主體設定的來源身分為 `nikki_wolf@example.com`。具有來源身分 `nikki_wolf@example.com` 的角色工作階段發出的任何請求都會遭拒，因為來源身分包含在政策條件中，且政策效果設定為 `Deny`。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "*",
      "Resource": "*",
      "Condition": {
        "StringLike": {
          "aws:SourceIdentity": [
            "nikki_wolf@example.com",
            "<source identity value>"
          ]
        }
      }
    }
  ]
}
```

------

### aws:userid
<a name="deny-access-condition-key-userid"></a>

您可以在身分型政策中使用條件內容索引鍵 [aws:userid](reference_policies_condition-keys.md#condition-keys-userid) 拒絕存取與 IAM 使用者或角色關聯的所有或特定臨時安全憑證工作階段。您可以透過在政策的 `Condition`元素中指定暫時安全登入資料相關聯的 IAM AWS STS 使用者、角色或聯合身分使用者工作階段的唯一識別符 (ID) 來執行此操作。

下列政策顯示如何使用條件內容索引鍵 `aws:userid` 拒絕存取暫時安全憑證工作階段的範例。
+ `AIDAXUSER1` 代表 IAM 使用者的唯一 ID。指定 IAM 使用者的唯一 ID 作為內容索引鍵 `aws:userid` 的值將拒絕存取 IAM 使用者。其中包括透過呼叫 `GetSessionToken` API 建立的任何臨時安全憑證工作階段。
+ `AROAXROLE1:*` 代表與 IAM 角色關聯的所有工作階段的唯一 ID。將 IAM 角色的唯一 ID 和 caller-specified-role-session-name 部分中的萬用字元 (\$1) 指定為內容索引鍵 `aws:userid` 的值將拒絕與該角色關聯的所有工作階段。
+ `AROAXROLE2:<caller-specified-role-session-name>` 代表擔任角色工作階段的唯一 ID。在擔任角色唯一 ID 的 caller-specified-role-session-name 部分中，如果使用 StringLike 條件運算子，您可以指定角色工作階段名稱或萬用字元。如果您指定角色工作階段名稱，則它會拒絕具名角色工作階段，而不會影響建立憑證的角色的許可。如果您為角色工作階段名稱指定萬用字元，則它會拒絕與角色關聯的所有工作階段。
**注意**  
呼叫者指定的角色工作階段名稱是擔任角色工作階段的唯一識別碼的一部分，可能會在角色鏈結期間變更。當一個角色擔任另一個角色時，會發生角色鏈結。當委託人使用 API 操作擔任角色時，會使用 AWS STS `AssumeRole` `RoleSessionName`請求參數設定角色工作階段名稱。
+ `account-id:<federated-user-caller-specified-name>` 代表 AWS STS 聯合身分使用者工作階段的唯一 ID。IAM 使用者透過呼叫 `GetFederationToken` API 來建立此工作階段。為 AWS STS 聯合身分使用者工作階段指定唯一 ID 會拒絕具名聯合身分工作階段，而不會影響建立憑證的 IAM 使用者的許可。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "*",
      "Resource": "*",
      "Condition": {
        "StringLike": {
          "aws:userId": [
            "AIDAXUSER1",
            "AROAXROLE1:*",
            "AROAXROLE2:<caller-specified-role-session-name>",
            "123456789012:<federated-user-caller-specified-name>"
          ]
        }
      }
    }
  ]
}
```

------

如需主體索引鍵值的特定範例，請參閱 [主體索引鍵值](reference_policies_variables.md#principaltable)。如需有關 IAM 唯一識別碼以及如何取得它們的資訊，請參閱[唯一識別碼](reference_identifiers.md#identifiers-unique-ids)。

## 使用資源型政策拒絕存取特定主體
<a name="deny-access-with-resource-based"></a>

若要使用資源型政策限制對特定主體的存取，您可以使用 `Condition` 元素中的條件內容索引鍵 [aws:PrincipalArn](reference_policies_condition-keys.md#condition-keys-principalarn) 或 [aws:SourceIdentity](reference_policies_condition-keys.md#condition-keys-sourceidentity)。資源型政策是連接至資源的許可政策，可控制誰可以存取資源，以及他們可以對其執行哪些動作。

當您使用`aws:PrincipalARN`內容金鑰時，請在政策的條件元素中指定與暫時安全登入資料相關聯的 IAM AWS STS 使用者、角色或聯合身分使用者工作階段的 ARN。下列範例政策示範如何在資源型政策中使用 `aws:PrincipalARN` 內容索引鍵：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Principal": "*",
    "Effect": "Deny",
    "Action": "s3:*",
    "Resource": "arn:aws:s3:::amzn-s3-demo-bucket",
    "Condition": {
      "ArnEquals": {
        "aws:PrincipalArn": [
          "arn:aws:iam::222222222222:role/ROLENAME",
          "arn:aws:iam::222222222222:user/USERNAME",
          "arn:aws:sts::222222222222:federated-user/USERNAME"
        ]
      }
    }
  }
}
```

------

當您使用 `aws:SourceIdentity` 內容索引鍵時，在政策的 `Condition` 元素中指定與角色的臨時安全憑證關聯的來源身分值。只要角色工作階段是在委託人使用任何 AWS STS `assume-role`\$1 CLI 命令或 AWS STS `AssumeRole`\$1 API 操作擔任角色時，透過設定`SourceIdentity`請求參數發出，就會套用。下列範例示範如何在資源型政策中使用 `aws:SourceIdentity` 內容索引鍵：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Principal": "*",
    "Effect": "Deny",
    "Action": "s3:*",
    "Resource": "arn:aws:s3:::amzn-s3-demo-bucket",
    "Condition": {
      "StringLike": {
        "aws:SourceIdentity": [
          "nikki_wolf@example.com",
          "<source identity value>"
        ]
      }
    }
  }
}
```

------

如果您僅更新主體的身分型政策，其仍然可以執行資源型政策中允許的動作，除非在身分型政策中明確拒絕這些動作。

**若要在資源型政策中拒絕存取特定主體**

1. 請參閱 [AWS 使用 IAM 的 服務](reference_aws-services-that-work-with-iam.md) 以查看服務是否支援以資源為基礎的政策。

1. 登入 AWS 管理主控台 並開啟 服務的 主控台。每個服務在主控台中都有不同的位置用於附加政策。

1. 編輯資源型政策。新增拒絕政策陳述式以指定憑證的識別資訊：

   1. 在 `Principal` 元素中，輸入萬用字元 (\$1)。在 `Condition` 元素中，主體將受到限制。

   1. 在 `Effect` 元素中，輸入 "Deny"。

   1. 在 `Action` 中，輸入服務命名空間和要拒絕的動作名稱。若要拒絕所有動作，請使用萬用字元 (\$1)。例如：`"s3:*"`。

   1. 在 `Resource` 元素中，輸入目標資源的 ARN。例如：`"arn:aws:s3:::amzn-s3-demo-bucket"`。

   1. 在 `Condition` 元素中，指定 `aws:PrincipalARN` 或 `aws:SourceIdentity` 內容索引鍵。

      如果您使用 `aws:PrincipalARN` 內容索引鍵，請輸入要拒絕其存取之主體的 ARN。

      如果您使用 `aws:SourceIdentity` 內容索引鍵，請在角色工作階段中輸入要拒絕存取的來源身分值。

1. 儲存您的工作。

# 授予許可以建立暫時性安全憑證
<a name="id_credentials_temp_control-access_enable-create"></a>

依預設，IAM 使用者沒有為 AWS STS 聯合身分使用者工作階段和角色建立臨時安全憑證的許可。您必須使用政策提供您的使用者這些許可。雖然您可以直接授予許可給使用者，我們強烈建議您將許可授予群組。這可讓許可的管理更輕鬆。當有人不再需要執行與許可相關的任務時，您只需從群組中移除許可。如果其別人需要執行該任務，將它們新增到群組以授予許可。

若要授予 IAM 群組為 AWS STS 聯合身分使用者工作階段或角色建立臨時安全憑證的許可，您可以連接能夠授予以下一個或兩個權限的政策：
+ 若要讓 OIDC 和 SAML 聯合主體存取 IAM 角色，請將存取權授予 AWS STS `AssumeRole`。
+ <a name="para_gsy_hxg_1t"></a>對於不需要角色的 AWS STS 聯合身分使用者，將存取權授予 AWS STS `GetFederationToken`。

 如需有關 `AssumeRole` 和 `GetFederationToken` API 操作間差異的詳細資訊，請參閱 [請求臨時安全憑證](id_credentials_temp_request.md)。

IAM 使用者也可以呼叫 [https://docs.aws.amazon.com/STS/latest/APIReference/API_GetSessionToken.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetSessionToken.html) 建立臨時安全憑證。使用者呼叫 `GetSessionToken` 不需要許可。此操作的目的是使用 MFA 驗證使用者的身分。您不能使用政策來控制身分驗證。這表示您無法避免 IAM 使用者呼叫 `GetSessionToken` 來建立臨時憑證。

**Example 授予許可以擔任角色的政策範例**  
下列範例政策授予 呼叫 中`UpdateApp`角色`AssumeRole`的許可 AWS 帳戶 `123123123123`。當使用 `AssumeRole` 時，代表聯合身分使用者建立安全憑證的使用者 (或應用程式)，無法委派角色許可政策中未指定的許可。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [{
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::123123123123:role/UpdateAPP"
  }]
}
```

**Example 授予許可以建立聯合身分使用者的暫時性安全憑證的政策範例**  
下列範例政策會授予許可以存取 `GetFederationToken`。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [{
    "Effect": "Allow",
    "Action": "sts:GetFederationToken",
    "Resource": "*"
  }]
}
```

**重要**  
當您授予 IAM 使用者許可，讓他們能夠透過 `GetFederationToken` 為 AWS STS 聯合身分使用者建立臨時安全憑證時，請留意，這會允許這些使用者委派自己的許可。如需在 IAM 使用者和 之間委派許可的詳細資訊 AWS 帳戶，請參閱 [委派存取權限的政策範例](id_roles_create_policy-examples.md)。如需有關如何控制暫時性安全憑證的許可的詳細資訊，請參閱[臨時安全憑證的許可](id_credentials_temp_control-access.md)。

**Example 授予使用者有限許可以建立聯合身分使用者的暫時性安全憑證的政策範例**  
當您讓 IAM 使用者呼叫 `GetFederationToken`，最佳實務是限制 IAM 使用者可以委派的許可。例如，下列政策顯示如何讓 IAM 使用者僅為名稱開頭為 *Manager* AWS STS 的聯合身分使用者建立臨時安全登入資料。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [{
    "Effect": "Allow",
    "Action": "sts:GetFederationToken",
    "Resource": ["arn:aws:sts::123456789012:federated-user/Manager*"]
  }]
}
```

# 授予許可以使用身分增強型主控台工作階段
<a name="id_credentials_temp_control-access_sts-setcontext"></a>

身分增強主控台工作階段可在 AWS IAM Identity Center 使用者登入時將使用者和工作階段 IDs AWS 包含在使用者的主控台工作階段中。例如，Amazon Q Developer Pro 利用身分增強型主控台工作階段來個人化服務體驗。如需有關身分增強型主控台工作階段的詳細資訊，請參閱 *AWS IAM Identity Center User Guide* 中的 [Enabling identity-enhanced console sessions](https://docs.aws.amazon.com/singlesignon/latest/userguide/identity-enhanced-sessions.html)。如需有關 Amazon Q Developer 設定的資訊，請參閱 *Amazon Q Developer User Guide* 中的 [Setting up Amazon Q Developer](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/setting-up.html)。

為了讓身分增強型主控台工作階段可供使用者使用，您必須使用身分型政策向 IAM 主體授予代表其自己的主控台工作階段的資源的 `sts:SetContext` 許可。

**重要**  
依預設，使用者無權為身分增強型主控台工作階段設定內容。為此，您必須在身分型政策中向 IAM 主體授予 `sts:SetContext` 許可，如下面的政策範例所示。

下列以身分為基礎的政策範例會將 `sts:SetContext`許可授予 IAM 主體，允許主體為自己的主控台工作階段設定身分增強型 AWS 主控台工作階段內容。政策資源 `arn:aws:sts::account-id:self`代表呼叫者的 AWS 工作階段。如果跨多個帳戶部署相同的許可政策 (例如使用 IAM Identity Center 許可集部署此政策)，則可以將 `account-id` ARN 區段取代為萬用字元 `*`。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:SetContext",
            "Resource": "arn:aws:sts::111122223333:self"
        }
    ]
}
```

------

# 在 AWS STS 中管理 AWS 區域
<a name="id_credentials_temp_enable-regions"></a>

區域端點是 Web 服務特定區域內進入點的 AWS URL。 AWS 建議使用 Regional AWS Security Token Service (AWS STS) 端點而非全域端點，以減少延遲、建置備援並提高工作階段字符有效性。雖然全域 （舊版） AWS STS 端點`https://sts.amazonaws.com`高度可用，但它託管在單一 AWS 區域、美國東部 （維吉尼亞北部） 和其他端點，但它不提供自動容錯移轉到其他區域中的端點。
+ **降低延遲** – 透過 AWS STS 呼叫地理位置上更接近服務和應用程式的端點，您可以存取具有更低延遲和更好回應時間 AWS STS 的服務。
+ **內建備援** – 您可以將工作負載內失敗的影響限制為有限數量的元件，且具有可預測的影響限制範圍。使用區域 AWS STS 端點可讓您將元件的範圍與工作階段字符的範圍保持一致。如需有關此可靠性支柱的詳細資訊，請參閱 *AWS  Well-Architected Framework *中的[使用故障隔離來保護工作負載](https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/use-fault-isolation-to-protect-your-workload.html)。
+ **提高工作階段字符有效性** – 區域 AWS STS 端點的工作階段字符在所有 中都有效 AWS 區域。來自全域 STS 端點的工作階段權杖僅在預設啟用 AWS 區域 的 中有效。如果您想要為帳戶啟用新的區域，您可以從區域 AWS STS 端點使用工作階段字符。如果您選擇使用全域端點，則必須變更全域端點之 AWS STS 工作階段字符的區域相容性。這樣做可確保字符在所有 中都有效 AWS 區域。

如需 AWS STS 區域及其端點的清單，請參閱 [AWS STS 區域和端點](id_credentials_temp_region-endpoints.md)。

**注意**  
AWS 已對[依預設啟用](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html)的區域中的 AWS Security Token Service (AWS STS) 全域端點 (`https://sts.amazonaws.com`) 進行變更，以增強其彈性和效能。對全域端點的 AWS STS 請求會在與您的工作負載 AWS 區域 相同的 中自動提供。這些變更不會部署至選擇加入區域。我們建議您使用適當的 AWS STS 區域端點。如需詳細資訊，請參閱[AWS STS 全域端點變更](id_credentials_temp_region-endpoints.md#reference_sts_global_endpoint_changes)。

**Topics**
+ [在 AWS STS 中啟用和停用 AWS 區域](#sts-regions-activate-deactivate)
+ [編寫程式碼以使用 AWS STS 區域](#id_credentials_temp_enable-regions_writing_code)
+ [管理全域端點的工作階段權杖](#sts-regions-manage-tokens)

## 在 AWS STS 中啟用和停用 AWS 區域
<a name="sts-regions-activate-deactivate"></a>

當您啟用區域的 AWS STS 端點時， AWS STS 可以向帳戶中提出 AWS STS 請求的使用者和角色發出臨時登入資料。然後，您就可以在預設啟用或手動啟用的任何區域中使用這些憑證。對於預設啟用的區域，您必須在產生臨時憑證的帳戶中啟用區域 AWS STS 端點。提出請求時使用者登入的是相同帳戶或不同帳戶並不重要。 AWS 帳戶 使用手動啟用的區域請求另一個 中角色的臨時登入資料時，目標帳戶 （包含該角色的帳戶） 必須啟用該區域以進行 AWS STS 操作。這樣可以確保正確地產生臨時安全憑證。

例如，假設帳戶 A 中的使用者想要向 [AWS STS 區域端點](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_region-endpoints.html) `https://sts.ap-southeast-3.amazonaws.com` 傳送 `sts:AssumeRole` API 請求。該請求的目的是為帳戶 B 中名為 `Developer` 的角色取得臨時憑證。由於請求的目的是為帳戶 B 中的實體建立憑證，因此帳戶 B 必須啟用 `ap-southeast-3` 區域。來自帳戶A (或任何其他帳戶) 的使用者可以呼叫 `ap-southeast-3` AWS STS 端點以請求帳戶 B 的憑證，無論該帳戶中是否已啟用該區域。若要進一步了解，請參閱[AWS 區域 在您的帳戶中啟用或停用](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html) 。

**注意**  
在該帳戶中使用臨時性憑證的每個人都可使用作用中的區域。若要控制哪些 IAM 使用者或角色可以存取區域，請在許可政策中使用 `aws:RequestedRegion` 條件金鑰。

**在預設啟用 AWS STS 的區域中啟用或停用 （主控台）**

1. 以具有 IAM 管理任務執行許可的根使用者或使用者身分來登入。

1. 開啟 [IAM 主控台](https://console.aws.amazon.com/iam/home?#home)，然後在導覽窗格中選擇 [https://console.aws.amazon.com/iam/home?#account_settings](https://console.aws.amazon.com/iam/home?#account_settings) (帳戶設定)。

1. 在 **Security Token Service (STS)** 的**端點**區段中，找到要設定的區域，然後在 **STS 狀態**資料欄中選擇**作用中**或**非作用中**。

1. 在開啟的對話方塊中，選擇 **Activate** (啟用) 或 **Deactivate** (停用)。

對於必須啟用的區域，我們會在您啟用區域時 AWS STS 自動啟用 。啟用區域之後， AWS STS 一律會為該區域啟用，且您無法停用該區域。若要了解如何啟用預設停用的區域，請參閱《 *AWS 帳戶管理 參考指南*》中的[指定 AWS 區域 您的帳戶可以使用哪些](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html)區域。

## 編寫程式碼以使用 AWS STS 區域
<a name="id_credentials_temp_enable-regions_writing_code"></a>

啟用區域之後，您可以將 AWS STS API 呼叫導向該區域。以下 Java 程式碼片段示範如何設定 `AWSSecurityTokenService` 物件，以對歐洲 (米蘭) (eu-south-1) 區域提出請求。

```
EndpointConfiguration regionEndpointConfig = new EndpointConfiguration("https://sts.eu-south-1.amazonaws.com", "eu-south-1");
AWSSecurityTokenService stsRegionalClient = AWSSecurityTokenServiceClientBuilder.standard()
.withCredentials(credentials)
.withEndpointConfiguration(regionEndpointConfig)
.build();
```

AWS STS 建議您呼叫區域端點。若要了解如何手動啟用區域，請參閱 *AWS 帳戶管理 Reference Guide* 中的[Specify which AWS 區域 your account can use](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html)。

在這個範例中，第一行會執行個體化稱為 `regionEndpointConfig` 的 `EndpointConfiguration` 物件，並將端點和 AWS 區域 的 URL 做為參數傳遞。

若要了解如何使用 SDKs AWS 的環境變數設定 AWS STS 區域端點，請參閱 *AWS SDKs和工具參考指南*中的[AWS STS 區域化端點](https://docs.aws.amazon.com/sdkref/latest/guide/feature-sts-regionalized-endpoints.html)。

對於所有其他語言和程式設計環境組合，請參閱[相關軟體開發套件的文件](https://aws.amazon.com/tools/)。

## 管理全域端點的工作階段權杖
<a name="sts-regions-manage-tokens"></a>

根據 AWS 服務 預設 AWS 區域 ，大多數都已啟用所有 中的操作。這些區域會自動啟用以搭配 使用 AWS STS。亞太區域 (香港) 之類的某些區域必須手動啟用。若要了解如何啟用和停用 AWS 區域，請參閱 *AWS 帳戶管理 Reference Guide* 中的 [Specify which AWS 區域 your account can use](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html)。當您啟用這些 AWS 區域時，它們會自動啟用以供 使用 AWS STS。您無法為已停用的區域啟用 AWS STS 端點。在所有 中有效的工作階段字符 AWS 區域 包含的字元多於在預設啟用的區域中有效的字符。變更此設定可能會影響暫時存放權杖的現有系統。

您可以使用 AWS 管理主控台 AWS CLI或 AWS API 變更此設定。

**變更全域端點工作階段權杖的區域相容性 (主控台)**

1. 以具有 IAM 管理任務執行許可的根使用者或使用者身分來登入。若要變更工作階段權杖的相容性，您必須擁有允許 `iam:SetSecurityTokenServicePreferences` 動作的政策。

1. 開啟 [ IAM 主控台](https://console.aws.amazon.com/iam/home?#home)。在導覽窗格中，選擇 **Account settings (帳戶設定)**。

1. 在 **Security Token Service (STS)** (安全權杖服務 (STS)) 區段的 **Session Tokens from the STS endpoints** (來自 STS 端點的工作階段權杖) 下方。**Global endpoint** (全域端點) 表示 `Valid only in AWS 區域 enabled by default`。選擇 **Change (變更)**。

1. 在**變更區域相容性**對話方塊中，選取**全部 AWS 區域**。接著選擇 **Save changes (儲存變更)**。
**注意**  
在所有 中有效的工作階段字符 AWS 區域 包含的字元多於在預設啟用的區域中有效的字符。變更此設定可能會影響暫時存放權杖的現有系統。

**變更全域端點工作階段權杖的區域相容性 (AWS CLI)**  
設定工作階段字符版本。第 1 版字符僅在預設 AWS 區域 可用的 中有效。這些權杖不適用於手動啟用的區域，例如亞太區域 (香港)。版本 2 權杖在所有區域都有效。不過，版本 2 權杖包含較多字元且可能會影響暫時存放權杖的系統。
+ [https://docs.aws.amazon.com/cli/latest/reference/iam/set-security-token-service-preferences.html](https://docs.aws.amazon.com/cli/latest/reference/iam/set-security-token-service-preferences.html)

**變更全域端點 (AWS API) 工作階段字符的區域相容性**  
設定工作階段字符版本。第 1 版字符僅在預設 AWS 區域 可用的 中有效。這些權杖不適用於手動啟用的區域，例如亞太區域 (香港)。版本 2 權杖在所有區域都有效。不過，版本 2 權杖包含較多字元且可能會影響暫時存放權杖的系統。
+ [https://docs.aws.amazon.com/IAM/latest/APIReference/API_SetSecurityTokenServicePreferences.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_SetSecurityTokenServicePreferences.html) 

# AWS STS 區域和端點
<a name="id_credentials_temp_region-endpoints"></a>

**注意**  
AWS 已對[依預設啟用](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html)的區域中的 AWS Security Token Service (AWS STS) 全域端點 (`https://sts.amazonaws.com`) 進行變更，以增強其彈性和效能。對全域端點的 AWS STS 請求會在與您的工作負載 AWS 區域 相同的 中自動提供。這些變更不會部署至選擇加入區域。我們建議您使用適當的 AWS STS 區域端點。如需詳細資訊，請參閱[AWS STS 全域端點變更](#reference_sts_global_endpoint_changes)。

下表列出區域及其端點。它會指出哪些是預設啟用，以及哪些可以啟用或停用。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/id_credentials_temp_region-endpoints.html)

¹ 您必須[啟用區域](https://docs.aws.amazon.com/general/latest/gr/rande-manage.html)才能使用它。這會自動啟動 AWS STS。您無法手動啟動或停用這些區域中的 AWS STS 。

2若要 AWS 在中國使用 ，您需要一個 帳戶和 登入資料，中國 AWS 為 。

## AWS STS 全域端點變更
<a name="reference_sts_global_endpoint_changes"></a>

AWS 已對[依預設啟用](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html)的區域中的 AWS Security Token Service (AWS STS) 全域端點 (`https://sts.amazonaws.com`) 進行變更，以增強其彈性和效能。先前，對 AWS STS 全球端點的所有請求都由單一 AWS 區域美國東部 （維吉尼亞北部） 提供服務。現在，在[預設啟用](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html)的區域中， AWS STS 全域端點的請求會在請求來源的相同區域中自動提供，而不是美國東部 （維吉尼亞北部） 區域。這些變更不會部署至選擇加入區域。

透過此變更， AWS STS 會根據使用的原始區域和 DNS 解析程式處理您的請求。如果 AWS STS 全域端點的 DNS 請求是由預設啟用區域中的 Amazon DNS 伺服器處理，則 AWS STS 全域端點的請求會在與 AWS 部署工作負載相同的區域中提供。如果請求來自選擇加入區域，或者請求是使用 DNS 解析程式而不是 Amazon DNS 伺服器進行解析，則向 AWS STS 全域端點發出的請求將繼續在美國東部 (維吉尼亞北部) 區域處理。如需有關 Amazon DNS 的詳細資訊，請參閱 *Amazon Virtual Private Cloud User Guide* 中的 [Amazon DNS server](https://docs.aws.amazon.com/vpc/latest/userguide/AmazonDNS-concepts.html#AmazonDNS)。

下表顯示 全域 AWS STS 端點的請求如何根據您的 DNS 供應商路由。


| DNS 解析程式 | 路由到本機 AWS STS 的全域端點請求 AWS 區域？ | 
| --- | --- | 
|  預設啟用區域中 Amazon VPC 中的 Amazon DNS 解析程式  |  是  | 
|  選擇加入區域中 Amazon VPC 中的 Amazon DNS 解析程式  |  否，請求將路由至美國東部 (維吉尼亞北部) 區域  | 
|  由 ISP、公有 DNS 供應商或任何其他 DNS 供應商提供的 DNS 解析程式  |  否，請求將路由至美國東部 (維吉尼亞北部) 區域  | 

為了確保對現有程序的干擾降到最低， AWS 已實作下列措施：
+ AWS CloudTrail 向 AWS STS 全域端點發出的請求日誌會傳送至美國東部 （維吉尼亞北部） 區域。 AWS STS 區域端點所提供請求的 CloudTrail 日誌將繼續記錄在 CloudTrail 中的其各自區域。
+  AWS STS 全域端點和區域端點所執行操作的 CloudTrail 日誌具有額外的欄位`awsServingRegion`，`endpointType`並指出哪個端點和區域提供請求。如需 CloudTrail 日誌範例，請參閱[CloudTrail 日誌檔案中使用全域端點的範例 AWS STS API 事件](cloudtrail-integration.md#stscloudtrailexample-assumerole-sts-global-endpoint)。
+ 無論向哪個區域提供請求，對 AWS STS 全域端點提出`us-east-1`的請求對於`aws:RequestedRegion`條件索引鍵的值為 。
+  AWS STS 全域端點處理的請求不會與區域 AWS STS 端點共用每秒請求配額。

如果您在選擇加入區域中有工作負載，但仍使用 AWS STS 全域端點，建議您遷移至 AWS STS 區域端點，以提高彈性和效能。如需設定區域 AWS STS 端點的詳細資訊，請參閱 *AWS SDKs和工具參考指南*中的[AWS STS 區域端點](https://docs.aws.amazon.com/sdkref/latest/guide/feature-sts-regionalized-endpoints.html)。

## AWS CloudTrail 和區域端點
<a name="sts-regions-cloudtrail"></a>

對區域和全域端點的呼叫會記錄在  AWS CloudTrail 的 `tlsDetails` 欄位中。對區域端點 (例如 `us-east-2.amazonaws.com`) 的呼叫會記錄在 CloudTrail 中適當的區域內。對此全球端點 `sts.amazonaws.com` 的呼叫都會記錄為對全球服務的呼叫。全域 AWS STS 端點的事件會記錄到 us-east-1。

**注意**  
 只有支援此欄位的服務可檢視 `tlsDetails`。請參閱 *AWS CloudTrail  使用者指南*中的 [CloudTrail 中支援 TLS 詳細資訊的服務](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-supported-tls-details.html)  
如需詳細資訊，請參閱[使用 記錄 IAM 和 AWS STS API 呼叫 AWS CloudTrail](cloudtrail-integration.md)。

# 啟用 AWS 主控台的自訂身分代理程式存取
<a name="id_roles_providers_enable-console-custom-url"></a>

您可以運用編寫和執行程式碼來建立 URL 以使登入到您組織網路的使用者能夠安全存取 AWS 管理主控台。URL 包含您從 取得 AWS 並驗證使用者的登入字符 AWS。產生的主控台工作階段可能因為聯合而包含不同的 `AccessKeyId`。若要透過相關 CloudTrail 事件追蹤聯合登入的存取金鑰使用情況，請參閱 [使用 記錄 IAM 和 AWS STS API 呼叫 AWS CloudTrail](cloudtrail-integration.md) 和 [AWS 管理主控台 登入事件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-aws-console-sign-in-events.html)。

**注意**  
如果您的組織使用與 SAML 相容的身分提供者 (IdP)，則無需編寫程式碼即可設定對主控台的存取許可。這適用於 Microsoft 的 Active Directory 聯合身分驗證服務或開放原始碼 Shibboleth 等提供者。如需詳細資訊，請參閱[啟用 SAML 2.0 聯合主體來存取 AWS 管理主控台](id_roles_providers_enable-console-saml.md)。

若要讓組織的使用者能夠存取 AWS 管理主控台，您可以建立執行下列步驟的自訂*身分代理程式*：

1. 確認您的本機身分系統已對使用者進行身分驗證。

1. 呼叫 AWS Security Token Service (AWS STS) [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) （建議） 或 [GetFederationToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html) API 操作，以取得使用者的臨時安全登入資料。要了解在擔任角色時使用的各種方法，請參閱 [擔任角色的方法](id_roles_manage-assume.md)。若要了解如何在取得您安全憑證時傳遞選用工作階段標籤，請參閱 [在 中傳遞工作階段標籤 AWS STS](id_session-tags.md)。
   + 如果使用某個 `AssumeRole*` API 操作取得角色的臨時安全性憑證，您可以在呼叫中包含 `DurationSeconds` 參數。此參數指定 900 秒 (15 分鐘) 到角色的最大工作階段持續時間設定之間的角色工作階段持續時間。當您在 `AssumeRole*` 操作中使用 `DurationSeconds` 時，您必須稱之為具有長期憑證的 IAM 使用者。否則，在步驟 3 中對聯合端點的呼叫將失敗。如要了解如何查看或更改角色的最大值，請參閱 [更新角色的最大工作階段持續時間](id_roles_update-role-settings.md#id_roles_update-session-duration)。
   + 如果使用某個 `GetFederationToken` API 操作取得憑證，您可以在呼叫中包含 `DurationSeconds` 參數。此參數指定您的角色工作階段的持續時間。該值的範圍是 900 秒 (15 分鐘) 到 129,600 秒 (36 小時)。您只能使用 IAM 使用者的長期 AWS 安全登入資料來進行此 API 呼叫。您也可以使用 AWS 帳戶根使用者 登入資料進行這些呼叫，但我們不建議這麼做。如果您以根使用者身分執行呼叫，則工作階段預設將持續 1 小時。或者，您可以指定 900 秒 (15 分鐘) 到 3,600 秒 (1 小時) 之間的工作階段。

1. 呼叫 AWS 聯合端點並提供臨時安全登入資料來請求登入字符。

1. 建構包含該權杖的主控台 URL：
   + 如果在 URL 中使用某個 `AssumeRole*` API 操作，您可以包含 `SessionDuration` HTTP 參數。此參數指定主控台工作階段持續時間，範圍是 900 秒 (15 分鐘) 到 43200 秒 (12 小時)。
   + 如果在 URL 中使用 `GetFederationToken` API 操作，您可以包含 `DurationSeconds` 參數。此參數指定您的聯合身分主控台工作階段的持續時間。該值的範圍是 900 秒 (15 分鐘) 到 129,600 秒 (36 小時)。
**注意**  
您的 `SessionDuration` 不能大於或等於您擔任之角色的工作階段持續時間上限設定。例如，您已將要擔任之角色的工作階段持續時間上限設定為 5 小時。您的 `SessionDuration` 參數可以是 16,524 秒或 4 小時 59 秒。
如果透過 `GetFederationToken` 取得臨時憑證，請勿使用 `SessionDuration` HTTP 參數。否則，操作會失敗。
使用一個角色的憑證來擔任不同的角色稱為[*角色鏈結*](id_roles.md#iam-term-role-chaining)。當您使用角色鏈結時，新憑證的最大持續時間限制為一小時。使用角色[授予許可給在 EC2 執行個體上執行的應用程式](id_roles_use_switch-role-ec2.md)時，那些應用程式不受此限制。
如果透過角色鏈結取得臨時憑證，請勿使用 `SessionDuration` HTTP 參數。否則，操作會失敗。

1. 將 URL 分配給使用者或代表使用者呼叫 URL。

聯合端點提供的 URL 在建立後的 15 分鐘內有效。這與 URL 關聯的臨時安全性憑證工作階段的持續時間 (以秒為單位) 不同。這些憑證在建立時指定的持續時間內有效，從建立的時間算起。

**重要**  
 AWS 管理主控台 如果您已在關聯的暫時安全登入資料中啟用許可，URL 會透過 授予 AWS 資源的存取權。因此，您應該將 URL 視為機密。我們建議您透過安全的重新引導傳回 URL，例如，在 SSL 連接上使用 302 HTTP 回應狀態碼。如需有關 302 HTTP 回應狀態碼的詳細資訊，請參閱 [RFC 2616, section 10.3.3](https://datatracker.ietf.org/doc/html/rfc2616#section-10.3.3)。

若要完成這些任務，您可以使用適用於 [AWS Identity and Access Management (IAM) 的 HTTPS Query API](https://docs.aws.amazon.com/IAM/latest/APIReference/) 和 [AWS Security Token Service (AWS STS)](https://docs.aws.amazon.com/STS/latest/APIReference/)。或者，您可以使用程式設計語言 (例如 Java、Ruby 或 C\$1) 與適當的 [AWS 開發套件](https://aws.amazon.com/tools/)。這些方法皆在下列主題中有詳述。

**Topics**
+ [使用 IAM 查詢 API 操作的範例程式碼](#STSConsoleLink_manual)
+ [使用 Python 的範例程式碼](#STSConsoleLink_programPython)
+ [使用 Java 的範例程式碼](#STSConsoleLink_programJava)
+ [範例顯示建構 URL 的方法 (Ruby)](#STSConsoleLink_programRuby)

## 使用 IAM 查詢 API 操作的範例程式碼
<a name="STSConsoleLink_manual"></a>

您可以建構一個 URL，向角色和聯合身分主體授予 AWS 管理主控台的直接存取權。此任務使用 IAM 和 AWS STS HTTPS 查詢 API。如需有關提出查詢請求的詳細資訊，請參閱[提出查詢請求](https://docs.aws.amazon.com/IAM/latest/UserGuide/IAM_UsingQueryAPI.html)。

**注意**  
以下過程包括了文字字串的範例。為增加可讀性，一些較長的範例中加入了分行符號。如果您要建立並使用這些字串，必須省略所有分行符號。

**讓角色和聯合委託人從 存取您的資源 AWS 管理主控台**

1. 在您的身分驗證系統裡驗證該使用者。

1. 為使用者取得臨時安全性憑證。臨時性憑證由存取金鑰 ID、私密存取金鑰和工作階段字符組成。如需有關建立暫時性憑證檔案的詳細資訊，請參閱 [IAM 中的暫時安全憑證](id_credentials_temp.md)。

   若要取得臨時登入資料，您可以呼叫 AWS STS [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API （建議） 或 [GetFederationToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html) API。如需這些 API 操作之間差異的詳細資訊，請參閱 AWS 安全部落格中的[了解安全委派存取您 AWS 帳戶的 API 選項](https://aws.amazon.com/blogs/security/understanding-the-api-options-for-securely-delegating-access-to-your-aws-account)。
**重要**  
在使用 [GetFederationToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html) API 建立暫時安全憑證時，您必須指定這些憑證授予擔任角色之使用者的許可。對於任何以 `AssumeRole*` 開頭的 API 操作，可使用 IAM 角色來分配許可。對於其他 API 操作，機制會因 API 而異。如需詳細資訊，請參閱 [臨時安全憑證的許可](id_credentials_temp_control-access.md)。此外，如果使用 `AssumeRole*` API 操作，您還必須以具有長期憑證的 IAM 使用者身分來呼叫這些操作。否則，在步驟 3 中對聯合端點的呼叫將失敗。  


1. 在取得臨時安全性憑證後，將其建構到 JSON 工作階段字串以將其交換為登入權杖。以下範例顯示如何為憑證編碼。請將預留位置文字替換為上一步驟中接收的憑證中的適用值。

   ```
   {"sessionId":"*** temporary access key ID ***",
   "sessionKey":"*** temporary secret access key ***",
   "sessionToken":"*** session token ***"}
   ```

1. [URL 編碼](https://en.wikipedia.org/wiki/Percent-encoding)前一步驟中的工作階段字串。由於您編碼的資訊是敏感資訊，因此建議您避免對此編碼使用 Web 服務。請改用開發套件中在本機安裝的函數或功能來安全地編碼這些資訊。您可以使用 Python 的 `urllib.quote_plus` 函數、Java 的 `URLEncoder.encode` 函數或 Ruby 的 `CGI.escape` 函數。請參閱本主題後述的範例。

1. <a name="STSConsoleLink_manual_step5"></a>
**注意**  
AWS 支援此處的 POST 請求。

   將您的請求傳送至 AWS 聯合端點：

   `https://region-code.signin.aws.amazon.com/federation` 

   對於可能的 *region-code* 值清單，請參閱 [AWS 登入端點](https://docs.aws.amazon.com/general/latest/gr/signin-service.html)中的 **Region** (區域) 欄位。您可以選擇使用預設 AWS 的登入聯合端點：

   `https://signin.aws.amazon.com/federation` 

   該請求必須包含 `Action` 與 `Session` 參數；(選擇性) 如果已使用 [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API 操作，還必須包含 `SessionDuration` HTTP 參數，如下列範例所示。

   ```
   Action = getSigninToken
   SessionDuration = time in seconds
   Session = *** the URL encoded JSON string created in steps 3 & 4 ***
   ```
**注意**  
此步驟中的下列指示僅適用於 GET 請求。

   `SessionDuration` HTTP 參數指定主控台工作階段的持續時間。它不同於使用 `DurationSeconds` 參數指定的臨時性憑證的持續時間。您可指定 `SessionDuration` 最高值為 43,200 (12 小時)。如果缺少 `SessionDuration` 參數，則工作階段預設為您在步驟 2 AWS STS 中從 擷取的憑證持續時間 （預設為一小時）。如需如何使用 `DurationSeconds` 參數指定持續時間的詳細資訊，請參閱 [`AssumeRole` API 的文件](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。建立超過 1 小時的主控台工作階段的功能是聯合端點的 `getSigninToken` 操作所內建的特性。
**注意**  
您的 `SessionDuration` 不能大於或等於您擔任之角色的工作階段持續時間上限設定。例如，您已將要擔任之角色的工作階段持續時間上限設定為 5 小時。您的 `SessionDuration` 參數可以是 16,524 秒或 4 小時 59 秒。
如果透過 `GetFederationToken` 取得臨時憑證，請勿使用 `SessionDuration` HTTP 參數。否則，操作會失敗。
使用一個角色的憑證來擔任不同的角色稱為[*角色鏈結*](id_roles.md#iam-term-role-chaining)。當您使用角色鏈結時，新憑證的最大持續時間限制為一小時。使用角色[授予許可給在 EC2 執行個體上執行的應用程式](id_roles_use_switch-role-ec2.md)時，那些應用程式不受此限制。
如果透過角色鏈結取得臨時憑證，請勿使用 `SessionDuration` HTTP 參數。否則，操作會失敗。

   在啟用具有更長持續時間的主控台工作階段時，您會增加洩露憑證的風險。為了幫助緩解這種風險，您可以在 **Role Summary** (角色摘要) IAM 主控台頁面上選擇 **Revoke Sessions** (撤銷工作階段) 來立即停用所有角色的使用中的主控台工作階段。如需詳細資訊，請參閱 [撤銷 IAM 角色臨時安全憑證](id_roles_use_revoke-sessions.md)。

    以下為請求具體形式的範例。在此處換行以便閱讀，但您應將其做為單行字串提交。

   ```
   https://signin.aws.amazon.com/federation
   ?Action=getSigninToken
   &SessionDuration=1800
   &Session=%7B%22sessionId%22%3A+%22ASIAJUMHIZPTOKTBMK5A%22%2C+%22sessionKey%22
   %3A+%22LSD7LWI%2FL%2FN%2BgYpan5QFz0XUpc8s7HYjRsgcsrsm%22%2C+%22sessionToken%2
   2%3A+%22FQoDYXdzEBQaDLbj3VWv2u50NN%2F3yyLSASwYtWhPnGPMNmzZFfZsL0Qd3vtYHw5A5dW
   AjOsrkdPkghomIe3mJip5%2F0djDBbo7SmO%2FENDEiCdpsQKodTpleKA8xQq0CwFg6a69xdEBQT8
   FipATnLbKoyS4b%2FebhnsTUjZZQWp0wXXqFF7gSm%2FMe2tXe0jzsdP0O12obez9lijPSdF1k2b5
   PfGhiuyAR9aD5%2BubM0pY86fKex1qsytjvyTbZ9nXe6DvxVDcnCOhOGETJ7XFkSFdH0v%2FYR25C
   UAhJ3nXIkIbG7Ucv9cOEpCf%2Fg23ijRgILIBQ%3D%3D%22%7D
   ```

   來自聯合身分端點的回應是一個具有 `SigninToken` 值的 JSON 文件。看起來與下列範例類似。

   ```
   {"SigninToken":"*** the SigninToken string ***"}
   ```

1. 
**注意**  
AWS 支援此處的 POST 請求。

   最後，建立使用者可用於存取 AWS 管理主控台的 URL。此 URL 與您在 [Step 5](#STSConsoleLink_manual_step5) 中使用的聯合身分 URL 端點相同，外加以下參數：

   ```
   ?Action = login
   &Issuer = *** the form-urlencoded URL for your internal sign-in page ***
   &Destination = *** the form-urlencoded URL to the desired AWS console page ***
   &SigninToken = *** the value of SigninToken received in the previous step ***
   ```
**注意**  
此步驟中的下列指示僅適用於 GET API。

   以下範例顯示 URL 的最終形式。URL 的有效期為 15 分鐘，自建立時算起。在 URL 中嵌入的臨時安全性憑證和主控台工作階段的有效期為在最初請求它們時在 `SessionDuration` HTTP 參數中指定的持續時間。

   ```
   https://signin.aws.amazon.com/federation
   ?Action=login
   &Issuer=https%3A%2F%2Fexample.com
   &Destination=https%3A%2F%2Fconsole.aws.amazon.com%2F
   &SigninToken=VCQgs5qZZt3Q6fn8Tr5EXAMPLEmLnwB7JjUc-SHwnUUWabcRdnWsi4DBn-dvC
   CZ85wrD0nmldUcZEXAMPLE-vXYH4Q__mleuF_W2BE5HYexbe9y4Of-kje53SsjNNecATfjIzpW1
   WibbnH6YcYRiBoffZBGExbEXAMPLE5aiKX4THWjQKC6gg6alHu6JFrnOJoK3dtP6I9a6hi6yPgm
   iOkPZMmNGmhsvVxetKzr8mx3pxhHbMEXAMPLETv1pij0rok3IyCR2YVcIjqwfWv32HU2Xlj471u
   3fU6uOfUComeKiqTGX974xzJOZbdmX_t_lLrhEXAMPLEDDIisSnyHGw2xaZZqudm4mo2uTDk9Pv
   9l5K0ZCqIgEXAMPLEcA6tgLPykEWGUyH6BdSC6166n4M4JkXIQgac7_7821YqixsNxZ6rsrpzwf
   nQoS14O7R0eJCCJ684EXAMPLEZRdBNnuLbUYpz2Iw3vIN0tQgOujwnwydPscM9F7foaEK3jwMkg
   Apeb1-6L_OB12MZhuFxx55555EXAMPLEhyETEd4ZulKPdXHkgl6T9ZkIlHz2Uy1RUTUhhUxNtSQ
   nWc5xkbBoEcXqpoSIeK7yhje9Vzhd61AEXAMPLElbWeouACEMG6-Vd3dAgFYd6i5FYoyFrZLWvm
   0LSG7RyYKeYN5VIzUk3YWQpyjP0RiT5KUrsUi-NEXAMPLExMOMdoODBEgKQsk-iu2ozh6r8bxwC
   RNhujg
   ```

## 使用 Python 的範例程式碼
<a name="STSConsoleLink_programPython"></a>

下列範例說明如何使用 Python 以程式設計方式建構 URL，向使用者授予 AWS 管理主控台直接存取權。以下是兩個範例：
+ 透過 GET 請求聯合至 AWS
+ 透過 POST 請求聯合至 AWS

這兩個範例都使用 [適用於 Python (Boto3) 的 AWS SDK](https://aws.amazon.com/tools/)和 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API 來取得臨時安全登入資料。

如果 `AssumeRoleSession` 憑證來自角色鏈結，請勿包含 `SessionDuration`。如果包含 `SessionDuration`，操作將會失敗。

### 使用 GET 請求
<a name="post-api-py-example"></a>

```
import urllib, json, sys
import requests # 'pip install requests'
import boto3 # AWS SDK for Python (Boto3) 'pip install boto3'

# Step 1: Authenticate user in your own identity system.

# Step 2: Using the access keys for an IAM user in your AWS 帳戶,
# call "AssumeRole" to get temporary access keys for the role or federated principal

# Note: Calls to AWS STS AssumeRole must be signed using the access key ID 
# and secret access key of an IAM user or using existing temporary credentials.
# The credentials can be in Amazon EC2 instance metadata, in environment variables, 
# or in a configuration file, and will be discovered automatically by the 
# client('sts') function. For more information, see the Python SDK docs:
# http://boto3.readthedocs.io/en/latest/reference/services/sts.html
# http://boto3.readthedocs.io/en/latest/reference/services/sts.html#STS.Client.assume_role
sts_connection = boto3.client('sts')

assumed_role_object = sts_connection.assume_role(
    RoleArn="arn:aws:iam::account-id:role/ROLE-NAME",
    RoleSessionName="AssumeRoleSession",
)

# Step 3: Format resulting temporary credentials into JSON
url_credentials = {}
url_credentials['sessionId'] = assumed_role_object.get('Credentials').get('AccessKeyId')
url_credentials['sessionKey'] = assumed_role_object.get('Credentials').get('SecretAccessKey')
url_credentials['sessionToken'] = assumed_role_object.get('Credentials').get('SessionToken')
json_string_with_temp_credentials = json.dumps(url_credentials)

# Step 4. Make request to AWS federation endpoint to get sign-in token. Construct the parameter string with
# the sign-in action request, a 12-hour session duration, and the JSON document with temporary credentials 
# as parameters.
request_parameters = "?Action=getSigninToken"
request_parameters += "&SessionDuration=43200"
if sys.version_info[0] < 3:
    def quote_plus_function(s):
        return urllib.quote_plus(s)
else:
    def quote_plus_function(s):
        return urllib.parse.quote_plus(s)
request_parameters += "&Session=" + quote_plus_function(json_string_with_temp_credentials)
request_url = "https://signin.aws.amazon.com/federation" + request_parameters
r = requests.get(request_url)
# Returns a JSON document with a single element named SigninToken.
signin_token = json.loads(r.text)

# Step 5: Create URL where users can use the sign-in token to sign in to 
# the console. This URL must be used within 15 minutes after the
# sign-in token was issued.
request_parameters = "?Action=login" 
request_parameters += "&Issuer=Example.org" 
request_parameters += "&Destination=" + quote_plus_function("https://console.aws.amazon.com/")
request_parameters += "&SigninToken=" + signin_token["SigninToken"]
request_url = "https://signin.aws.amazon.com/federation" + request_parameters

# Send final URL to stdout
print (request_url)
```

### 使用 POST 請求
<a name="get-api-py-example-1"></a>

```
import urllib, json, sys
import requests # 'pip install requests'
import boto3 # AWS SDK for Python (Boto3) 'pip install boto3'
import os
from selenium import webdriver # 'pip install selenium', 'brew install chromedriver'

# Step 1: Authenticate user in your own identity system.

# Step 2: Using the access keys for an IAM user in your A AWS 帳戶,
# call "AssumeRole" to get temporary access keys for the role or federated principal

# Note: Calls to AWS STS AssumeRole must be signed using the access key ID 
# and secret access key of an IAM user or using existing temporary credentials.
# The credentials can be in Amazon EC2 instance metadata, in environment variables, 

# or in a configuration file, and will be discovered automatically by the 
# client('sts') function. For more information, see the Python SDK docs:
# http://boto3.readthedocs.io/en/latest/reference/services/sts.html
# http://boto3.readthedocs.io/en/latest/reference/services/sts.html#STS.Client.assume_role
if sys.version_info[0] < 3:
    def quote_plus_function(s):
        return urllib.quote_plus(s)
else:
    def quote_plus_function(s):
        return urllib.parse.quote_plus(s)

sts_connection = boto3.client('sts')

assumed_role_object = sts_connection.assume_role(
    RoleArn="arn:aws:iam::account-id:role/ROLE-NAME",
    RoleSessionName="AssumeRoleDemoSession",
)

# Step 3: Format resulting temporary credentials into JSON
url_credentials = {}
url_credentials['sessionId'] = assumed_role_object.get('Credentials').get('AccessKeyId')
url_credentials['sessionKey'] = assumed_role_object.get('Credentials').get('SecretAccessKey')
url_credentials['sessionToken'] = assumed_role_object.get('Credentials').get('SessionToken')
json_string_with_temp_credentials = json.dumps(url_credentials)

# Step 4. Make request to AWS federation endpoint to get sign-in token. Construct the parameter string with
# the sign-in action request, a 12-hour session duration, and the JSON document with temporary credentials 
# as parameters.
request_parameters = {}
request_parameters['Action'] = 'getSigninToken'
request_parameters['SessionDuration'] = '43200'
request_parameters['Session'] = json_string_with_temp_credentials

request_url = "https://signin.aws.amazon.com/federation"
r = requests.post( request_url, data=request_parameters)

# Returns a JSON document with a single element named SigninToken.
signin_token = json.loads(r.text)

# Step 5: Create a POST request where users can use the sign-in token to sign in to 
# the console. The POST request must be made within 15 minutes after the
# sign-in token was issued.
request_parameters = {}
request_parameters['Action'] = 'login'
request_parameters['Issuer']='Example.org'
request_parameters['Destination'] = 'https://console.aws.amazon.com/'
request_parameters['SigninToken'] =signin_token['SigninToken']

jsrequest = '''
var form = document.createElement('form');
form.method = 'POST';
form.action = '{request_url}';
request_parameters = {request_parameters}
for (var param in request_parameters) {{
    if (request_parameters.hasOwnProperty(param)) {{
        const hiddenField = document.createElement('input');
        hiddenField.type = 'hidden';
        hiddenField.name = param;
        hiddenField.value = request_parameters[param];
        form.appendChild(hiddenField);
    }}
}}
document.body.appendChild(form);
form.submit();
'''.format(request_url=request_url, request_parameters=request_parameters)

driver = webdriver.Chrome()
driver.execute_script(jsrequest)
input("Press Enter to close the browser window...")
```

## 使用 Java 的範例程式碼
<a name="STSConsoleLink_programJava"></a>

下列範例說明如何使用 Java 以程式設計方式建構 URL，向使用者授予 AWS 管理主控台的直接存取權。下列程式碼片段使用 [AWS SDK for Java](https://aws.amazon.com/documentation/sdkforjava/)。

```
import java.net.URLEncoder;
import java.net.URL;
import java.net.URLConnection;
import java.io.BufferedReader;
import java.io.InputStreamReader;
// Available at http://www.json.org/java/index.html
import org.json.JSONObject;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.securitytoken.AWSSecurityTokenServiceClient;
import com.amazonaws.services.securitytoken.model.Credentials;
import com.amazonaws.services.securitytoken.model.GetFederationTokenRequest;
import com.amazonaws.services.securitytoken.model.GetFederationTokenResult;


/* Calls to AWS STS API operations must be signed using the access key ID 
   and secret access key of an IAM user or using existing temporary 
   credentials. The credentials should not be embedded in code. For 
   this example, the code looks for the credentials in a 
   standard configuration file.
*/
AWSCredentials credentials = 
  new PropertiesCredentials(
         AwsConsoleApp.class.getResourceAsStream("AwsCredentials.properties"));

AWSSecurityTokenServiceClient stsClient = 
  new AWSSecurityTokenServiceClient(credentials);

GetFederationTokenRequest getFederationTokenRequest = 
  new GetFederationTokenRequest();
getFederationTokenRequest.setDurationSeconds(1800);
getFederationTokenRequest.setName("UserName");

// A sample policy for accessing Amazon Simple Notification Service (Amazon SNS) in the console.

String policy = "{\"Version\":\"2012-10-17\",		 	 	 \"Statement\":[{\"Action\":\"sns:*\"," +
  "\"Effect\":\"Allow\",\"Resource\":\"*\"}]}";

getFederationTokenRequest.setPolicy(policy);

GetFederationTokenResult federationTokenResult = 
  stsClient.getFederationToken(getFederationTokenRequest);

Credentials federatedCredentials = federationTokenResult.getCredentials();

// The issuer parameter specifies your internal sign-in
// page, for example https://mysignin.internal.mycompany.com/.
// The console parameter specifies the URL to the destination console of the
// AWS Management Console. This example goes to Amazon SNS. 
// The signin parameter is the URL to send the request to.

String issuerURL = "https://mysignin.internal.mycompany.com/";
String consoleURL = "https://console.aws.amazon.com/sns";
String signInURL = "https://signin.aws.amazon.com/federation";
  
// Create the sign-in token using temporary credentials,
// including the access key ID,  secret access key, and session token.
String sessionJson = String.format(
  "{\"%1$s\":\"%2$s\",\"%3$s\":\"%4$s\",\"%5$s\":\"%6$s\"}",
  "sessionId", federatedCredentials.getAccessKeyId(),
  "sessionKey", federatedCredentials.getSecretAccessKey(),
  "sessionToken", federatedCredentials.getSessionToken());
              
// Construct the sign-in request with the request sign-in token action, a
// 12-hour console session duration, and the JSON document with temporary 
// credentials as parameters.

String getSigninTokenURL = signInURL + 
                           "?Action=getSigninToken" +
                           "&DurationSeconds=43200" + 
                           "&SessionType=json&Session=" + 
                           URLEncoder.encode(sessionJson,"UTF-8");

URL url = new URL(getSigninTokenURL);

// Send the request to the AWS federation endpoint to get the sign-in token
URLConnection conn = url.openConnection ();

BufferedReader bufferReader = new BufferedReader(new 
  InputStreamReader(conn.getInputStream()));  
String returnContent = bufferReader.readLine();

String signinToken = new JSONObject(returnContent).getString("SigninToken");

String signinTokenParameter = "&SigninToken=" + URLEncoder.encode(signinToken,"UTF-8");

// The issuer parameter is optional, but recommended. Use it to direct users
// to your sign-in page when their session expires.

String issuerParameter = "&Issuer=" + URLEncoder.encode(issuerURL, "UTF-8");

// Finally, present the completed URL for the AWS console session to the user

String destinationParameter = "&Destination=" + URLEncoder.encode(consoleURL,"UTF-8");
String loginURL = signInURL + "?Action=login" +
                     signinTokenParameter + issuerParameter + destinationParameter;
```

## 範例顯示建構 URL 的方法 (Ruby)
<a name="STSConsoleLink_programRuby"></a>

以下範例顯示了如何使用 Ruby 以程式設計方式構建 URL，向使用者授予 AWS 管理主控台的直接存取權。此程式碼片段使用 [AWS SDK for Ruby](https://aws.amazon.com/documentation/sdkforruby/)。

```
require 'rubygems'
require 'json'
require 'open-uri'
require 'cgi'
require 'aws-sdk'

# Create a new STS instance
# 
# Note: Calls to AWS STS API operations must be signed using an access key ID 
# and secret access key. The credentials can be in EC2 instance metadata 
# or in environment variables and will be automatically discovered by
# the default credentials provider in the AWS Ruby SDK. 
sts = Aws::STS::Client.new()

# The following call creates a temporary session that returns 
# temporary security credentials and a session token.
# The policy grants permissions to work
# in the AWS SNS console.

session = sts.get_federation_token({
  duration_seconds: 1800,
  name: "UserName",
  policy: "{\"Version\":\"2012-10-17\",		 	 	 \"Statement\":{\"Effect\":\"Allow\",\"Action\":\"sns:*\",\"Resource\":\"*\"}}",
})

# The issuer value is the URL where users are directed (such as
# to your internal sign-in page) when their session expires.
#
# The console value specifies the URL to the destination console.
# This example goes to the Amazon SNS console.
#
# The sign-in value is the URL of the AWS STS federation endpoint.
issuer_url = "https://mysignin.internal.mycompany.com/"
console_url = "https://console.aws.amazon.com/sns"
signin_url = "https://signin.aws.amazon.com/federation"

# Create a block of JSON that contains the temporary credentials
# (including the access key ID, secret access key, and session token).
session_json = {
  :sessionId => session.credentials[:access_key_id],
  :sessionKey => session.credentials[:secret_access_key],
  :sessionToken => session.credentials[:session_token]
}.to_json

# Call the federation endpoint, passing the parameters
# created earlier and the session information as a JSON block. 
# The request returns a sign-in token that's valid for 15 minutes.
# Signing in to the console with the token creates a session 
# that is valid for 12 hours.
get_signin_token_url = signin_url + 
                       "?Action=getSigninToken" + 
                       "&SessionType=json&Session=" + 
                       CGI.escape(session_json)

returned_content = URI.parse(get_signin_token_url).read

# Extract the sign-in token from the information returned
# by the federation endpoint.
signin_token = JSON.parse(returned_content)['SigninToken']
signin_token_param = "&SigninToken=" + CGI.escape(signin_token)

# Create the URL to give to the user, which includes the
# sign-in token and the URL of the console to open.
# The "issuer" parameter is optional but recommended.
issuer_param = "&Issuer=" + CGI.escape(issuer_url)
destination_param = "&Destination=" + CGI.escape(console_url)
login_url = signin_url + "?Action=login" + signin_token_param + 
  issuer_param + destination_param
```