

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

# 将属性用于访问控制
<a name="attributes-for-access-control"></a>

访问控制属性是基于属性的访问权限控制（ABAC）的 Amazon Cognito 身份池实现。您可以通过基于用户属性的 Amazon Cognito 身份池使用 IAM 策略来控制对 AWS 资源的访问。可以从社交和企业身份提供商那里获得这些属性。您可以将提供商的访问权限和 ID 令牌或 SAML 断言中的属性映射到可在 IAM 权限策略中引用的标签。

您可以选择默认映射或在 Amazon Cognito 身份池中创建自己的自定义映射。默认映射让您可以根据一组固定的用户属性编写 IAM 策略。自定义映射允许您选择 IAM 权限策略中引用的一组自定义用户属性。Amazon Cognito 控制台中的 **Attribute names (属性名称)** 已映射到 **Tag key for principal (委托人的标签密钥)**，这些是 IAM 权限策略中引用的标签。

例如，假设您拥有一个具有免费和付费会员资格的媒体流式传输服务。您可以将媒体文件存储在 Amazon S3 中，并使用免费或高级标签对其贴标签。您可以将属性用于访问控制，以允许访问基于用户会员级别（这是用户配置文件的一部分）的免费和付费内容。您可以将成员资格属性映射到委托人的标签密钥，以传递给 IAM 权限策略。通过这种方式，您可以创建单个权限策略，并根据会员级别的值和内容文件上的标签有条件地允许对高级内容的访问。

**Topics**
+ [使用属性对 Amazon Cognito 身份池进行访问控制](#using-afac-with-cognito-identity-pools)
+ [示例：将属性用于访问控制策略](#using-attributes-for-access-control-policy-example)
+ [关闭访问控制属性（控制台）](#disable-afac)
+ [默认提供商映射](#provider-mappings)

使用属性来控制访问有若干优势：
+ 使用属性进行访问控制时，权限管理会更高效。您可以创建使用用户属性的基本权限策略，而不必为不同的任务功能创建多个策略。
+ 不管您何时为应用程序添加或删除资源或用户，都无需更新策略。权限策略只向具有匹配用户属性的用户授予访问权限。例如，您可能需要根据用户的任务标题控制对某些 S3 存储桶的访问权限。在这种情况下，您可以创建权限策略，以便仅允许定义的任务标题中的用户访问这些文件。有关更多信息，请参阅 [IAM 教程：将 SAML 会话标签用于 ABAC](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_abac-saml.html)。
+ 属性可以作为委托人标签传递给策略，该策略基于这些属性的值允许或拒绝权限。

## 使用属性对 Amazon Cognito 身份池进行访问控制
<a name="using-afac-with-cognito-identity-pools"></a>

使用属性进行访问控制之前，请确保满足以下先决条件：
+ [一个 AWS 账户](https://docs.aws.amazon.com/cognito/latest/developerguide/getting-started-with-identity-pools.html#aws-sign-up-identity-pools)
+ [用户池](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)
+ [身份池](https://docs.aws.amazon.com/cognito/latest/developerguide/getting-started-with-identity-pools.html#create-identity-pools)
+ [设置 SDK](getting-started-with-identity-pools.md#install-the-mobile-or-javascript-sdk)
+ [已集成身份提供商](https://docs.aws.amazon.com/cognito/latest/developerguide/getting-started-with-identity-pools.html##integrate-the-identity-providers)
+ [凭据](https://docs.aws.amazon.com/cognito/latest/developerguide/getting-started-with-identity-pools.html#get-credentials)

要使用属性进行访问控制，您设置为数据来源的**声明**将设置您选择的**标签键**的值。Amazon Cognito 会将标签键和值应用于您的用户会话。您的 IAM policy 可以根据 `${aws:PrincipalTag/tagkey}` 条件评估用户的访问权限。IAM 会根据策略评估用户标签的值。

您必须准备要将其凭证传递给用户的 IAM 角色。这些角色的信任策略必须允许 Amazon Cognito 为您的用户代入该角色。对于用于访问控制的属性，您还必须允许 Amazon Cognito 将主体标签应用于用户的临时会话。授予通过操作代入角色的权限[AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html)。授予使用[仅限权限操作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awssecuritytokenservice.html#awssecuritytokenservice-actions-as-permissions) `sts:TagSession` 标记用户会话的权限。有关更多信息，请参阅《AWS Identity and Access Management 用户指南》**中的[在 AWS Security Token Service中传递会话标签](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html)。有关向 Amazon Cognito 服务主体 `cognito-identity.amazonaws.com` 授予 `sts:AssumeRoleWithWebIdentity` 和 `sts:TagSession` 权限的示例信任策略，请参阅[示例：将属性用于访问控制策略](#using-attributes-for-access-control-policy-example)。

**在控制台中配置访问控制属性**

1. 登录 [Amazon Cognito 控制台](https://console.aws.amazon.com/cognito/home)并选择**身份池**。选择身份池。

1. 选择**用户访问**选项卡。

1. 找到**身份提供者**。选择要编辑的身份提供者。如果要添加新的 IdP，请选择**添加身份提供者**。

1. 要更改 Amazon Cognito 在向通过该提供者进行身份验证的用户颁发凭证时分配的主体标签，请在**访问控制属性**中选择**编辑**。

   1. 如果不应用主体标签，请选择**非活动**。

   1. 要基于 `sub` 和 `aud` 声明应用主体标签，请选择**使用原定设置映射**。

   1. 要为主体标签创建自己的自定义属性模式，请选择**使用自定义映射**。然后，对于您要在标签中表示的每个**声明**，输入要从该声明中获取的**标签键**。

1. 选择**保存更改**。

## 示例：将属性用于访问控制策略
<a name="using-attributes-for-access-control-policy-example"></a>

考虑这样一种场景：某公司法律部门的员工需要列出存储桶中属于其部门并按其安全级别分类的所有文件。假定此员工从身份提供商获得的令牌包含以下陈述。

**声明**

```
            { .
              .
            "sub" : "57e7b692-4f66-480d-98b8-45a6729b4c88",
            "department" : "legal",
            "clearance" : "confidential",
             .
             .
            }
```

这些属性可以映射到标签，并在 IAM 权限策略中作为委托人标签引用。现在，您可以通过更改身份提供商端的用户配置文件来管理访问权限。或者，您可以使用名称或标签来更改资源端的属性，而无需更改策略本身。

以下权限策略有两个作用：
+ 允许列表访问以与用户部门名称匹配的前缀结尾的所有 S3 桶。
+ 允许对这些存储桶中的文件进行读取访问，只要文件上的清理标签与用户的清理属性匹配。

**权限策略**

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

****  

```
   {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:List*",
            "Resource": "arn:aws:s3:::*-${aws:PrincipalTag/department}"
        },
        {
            "Effect": "Allow",
            "Action": "s3:GetObject*",
            "Resource": "arn:aws:s3:::*-${aws:PrincipalTag/department}/*",
            "Condition": {
                "StringEquals": {
                    "s3:ExistingObjectTag/clearance": "${aws:PrincipalTag/clearance}"
                }
            }
        }
    ]
}
```

------

信任策略决定谁可担任此角色。信任关系策略允许使用 `sts:AssumeRoleWithWebIdentity` 和 `sts:TagSession` 来允许访问。它添加了一部分条件，以将策略限制为您创建的身份池，并确保该策略适用于经身份验证的角色。

**信任策略**

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "cognito-identity.amazonaws.com"
      },
      "Action": [
        "sts:AssumeRoleWithWebIdentity",
        "sts:TagSession"
      ],
      "Condition": {
        "StringEquals": {
          "cognito-identity.amazonaws.com:aud": "IDENTITY-POOL-ID"
        },
        "ForAnyValue:StringLike": {
          "cognito-identity.amazonaws.com:amr": "authenticated"
        }
      }
    }
  ]
}
```

------

## 关闭访问控制属性（控制台）
<a name="disable-afac"></a>

按照以下操作步骤来停用访问控制属性。

**在控制台中停用访问控制属性**

1. 登录 [Amazon Cognito 控制台](https://console.aws.amazon.com/cognito/home)并选择**身份池**。选择身份池。

1. 选择**用户访问**选项卡。

1. 找到**身份提供者**。选择要编辑的身份提供者。

1. 在**访问控制属性**中选择**编辑**。

1. 如果不应用主体标签，请选择**非活动**。

1. 选择**保存更改**。

## 默认提供商映射
<a name="provider-mappings"></a>

下表提供 Amazon Cognito 支持的身份验证提供商的默认映射信息。


| Provider | 令牌类型 | 委托人标签值 | 示例 | 
| --- | --- | --- | --- | 
|  Amazon Cognito 用户池  |  ID 令牌  |  aud（客户端 ID）和 sub（用户 ID）  |  "6jk8ltokc7ac9es6jrtg9q572f"，"57e7b692-4f66-480d-98b8-45a6729b4c88"  | 
|  Facebook  |  访问令牌  |  aud（app\$1id），sub（user\$1id）  |  “492844718097981”，“112177216992379”  | 
|  Google  |  ID 令牌  |  aud（客户端 ID）和 sub（用户 ID）  |  “620493171733-eebk7c0hcp5lj3e1tlqp1gntt3k0rncv.apps.googleusercontent.com”，“109220063452404746097”  | 
|  SAML  |  断言  |  “http://schemas.xmlsoap。 org/ws/2005/05/identity/claims/nameidentifier" , "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name”   |  "auth0\$15e28d196f8f55a0eaaa95de3"，"user123@gmail.com"  | 
|  Apple  |  ID 令牌  |  aud（客户端 ID）和 sub（用户 ID）  |  “com.amazonaws.ec2-54-80-172-243.compute-1.client”，“001968.a6ca34e9c1e742458a26cf8005854be9.0733”  | 
|  Amazon  |  访问令牌  |  aud（Amzn Dev Ac 上的客户端 ID），user\$1id（用户 ID）  |  “amzn1.application-oa2-client.9d70d9382d3446108aaee3dd763a0fa6”，“amzn1.account。 AGHNIFJQMFSBG3G6 XCPVB35 ORQAA”  | 
|  标准 OIDC 提供商  |  ID 令牌和访问令牌  |  aud（作为 client\$1id）和 sub（作为用户 ID）  |  “620493171733-eebk7c0hcp5lj3e1tlqp1gntt3k0rncv.apps.googleusercontent.com”，“109220063452404746097”  | 
|  Twitter  |  访问令牌  |  aud（应用程序 ID；应用程序密钥），sub（用户 ID）  |  “DfwifTtKEX1Fi IBRn OTl R0CFK；xgj5xb8xir Xg w7fxmwc fvnok9 1y5z1，“1269003884292222976IVCPj” LIdk JJr gwZkLexo  | 
|  DevAuth  |  Map  |  不适用  |  "tag1", "tag2"  | 

**注意**  
**Tag Key for Principal (委托人的标签密钥)** 和 **Attribute (属性)** 名称的默认属性映射选项会自动填充。您无法更改默认映射。