

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Amazon Cognito 身份来源
<a name="identity-sources-cognito"></a>

经过验证的权限与 Amazon Cognito 用户池密切配合。 Amazon Cognito JWTs 具有可预测的结构。经过验证的权限可以识别这种结构，并从其中包含的信息中获得最大收益。例如，您可以使用 ID 令牌或访问令牌实现基于角色的访问控制 (RBAC) 授权模型。

新的 Amazon Cognito 用户池身份源需要以下信息：
+ 的 Amazon Web Services 区域。
+ 用户池 ID。
+ 例如，您要与身份源关联的委托人实体类型`MyCorp::User`。
+ 例如，您要与身份源关联的委托人组实体类型`MyCorp::UserGroup`。
+ 您想要授权的用户池 IDs 中的客户端，以便向您的策略存储库发出请求。

由于已验证权限仅适用于相同的 Amazon Cognito 用户池 Amazon Web Services 账户，因此您无法在其他账户中指定身份来源。例如，Verified Permissions 会将*实体前缀*（您在作用于用户池主体的策略中必须引用的身份源标识符）设置为用户池的 ID。`us-west-2_EXAMPLE`在这种情况下，您可以将该用户池中的用户引用`a1b2c3d4-5678-90ab-cdef-EXAMPLE22222`为 `us-west-2_EXAMPLE|a1b2c3d4-5678-90ab-cdef-EXAMPLE22222`

用户池令牌*声明*可以包含属性、范围、群组 IDs、客户和自定义数据。 [Amazon Cognito JWTs](https://docs.amazonaws.cn/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html)能够在 “已验证权限” 中包含可能有助于做出授权决策的各种信息。这些方法包括：

1. 带有`cognito:`前缀的用户名和群组声明

1. [使用自定义用户属性](https://docs.amazonaws.cn/cognito/latest/developerguide/user-pool-settings-attributes.html#user-pool-settings-custom-attributes) `custom: prefix`

1. 在运行时添加了自定义声明

1. OIDC 的标准声明，比如和 `sub` `email`

我们将在中的已验证权限政策中详细介绍这些声明以及如何管理这些声明[将 Amazon Cognito 令牌映射到架构](cognito-map-token-to-schema.md)。

**重要**  
尽管您可以在 Amazon Cognito 令牌到期之前将其撤销，但 JWTs 它们被视为具有签名和有效性的独立无状态资源。符合 [JSON Web Token RFC 7519](https://datatracker.ietf.org/doc/html/rfc7519) 的服务需要远程验证令牌，无需向发布者进行验证。这意味着，Verified Permissions 可以根据已撤销或向后来被删除的用户颁发的令牌来授予访问权限。为了降低这种风险，我们建议您创建有效期尽可能较短的令牌，并在想要删除授权以终止用户会话时撤消刷新令牌。有关更多信息，请参阅[通过撤消令牌结束用户会话](https://docs.amazonaws.cn/cognito/latest/developerguide/token-revocation.html)

以下示例说明如何创建引用与委托人关联的某些 Amazon Cognito 用户池索赔的策略。

```
permit(
     principal, 
     action, 
     resource == ExampleCo::Photo::"VacationPhoto94.jpg" 
)
when { 
     principal["cognito:username"]) == "alice" &&
     principal["custom:department"]) == "Finance"
};
```

以下示例说明如何创建引用 Cognito 用户池中用户的委托人的策略。请注意，委托人 ID 的形式为`"<userpool-id>|<sub>"`。

```
permit(
     principal == ExampleCo::User::"us-east-1_example|a1b2c3d4-5678-90ab-cdef-EXAMPLE11111", 
     action, 
     resource == ExampleCo::Photo::"VacationPhoto94.jpg" 
);
```

针对已验证权限中的用户池身份源的 Cedar 策略对包含字母数字和下划线 (`_`) 以外的字符的声明名称使用特殊语法。这包括包含`:`字符的用户池前缀声明，例如`cognito:username`和`custom:department`。要编写引用`cognito:username`或`custom:department`声明的保单条件，请分别将其`principal["cognito:username"]`写成和。`principal["custom:department"]`

**注意**  
如果令牌包含带`cognito:`或`custom:`前缀的声明和带有字面值`cognito`或的声明名称`custom`，则带有的授权请求[IsAuthorizedWithToken](https://docs.amazonaws.cn/verifiedpermissions/latest/apireference/API_IsAuthorizedWithToken.html)将失败，并显示为`ValidationException`。

有关映射声明的更多信息，请参阅[将 Amazon Cognito 令牌映射到架构](cognito-map-token-to-schema.md)。有关 Amazon Cognito 用户授权的更多信息，请参阅 Amazon *Cognito 开发者指南中的使用亚马逊*[验证权限进行授](https://docs.amazonaws.cn/cognito/latest/developerguide/amazon-cognito-authorization-with-avp.html)权。

**Topics**
+ [创建 Amazon 认证权限 Amazon Cognito 身份源](cognito-create.md)
+ [编辑 Amazon 已验证权限的 Amazon Cognito 身份来源](cognito-edit.md)
+ [将 Amazon Cognito 令牌映射到架构](cognito-map-token-to-schema.md)
+ [客户和受众验证 Amazon Cognito](cognito-validation.md)