本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
添加上下文
背景是指与政策决策相关的信息,但不是您的委托人、行为或资源身份的一部分。访问令牌声明是上下文。您可能只想允许来自一组源 IP 地址的操作,或者仅当您的用户使用登录时才允许执行操作MFA。您的应用程序可以访问此上下文会话数据,并且必须将其填充到授权请求中。已验证权限授权请求中的上下文数据必须在contextMap
元素中进行JSON格式化。
说明此内容的示例来自策略存储库示例。要继续操作,请在您的测试环境中创建DigitalPetStore示例策略存储。
以下上下文对象根据示例DigitalPetStore策略存储为应用程序声明每种 Cedar 数据类型之一。
"context": {
"contextMap": {
"MfaAuthorized": {
"boolean": true
},
"AccountCodes": {
"set": [
{
"long": 111122223333
},
{
"long": 444455556666
},
{
"long": 123456789012
}
]
},
"UserAgent": {
"string": "My UserAgent 1.12"
},
"RequestedOrderCount": {
"long": 4
},
"NetworkInfo": {
"record": {
"IPAddress": {
"string": "192.0.2.178"
},
"Country": {
"string": "United States of America"
},
"SSL": {
"boolean": true
}
}
},
"approvedBy": {
"entityIdentifier": {
"entityId": "Bob",
"entityType": "DigitalPetStore::User"
}
}
}
}
授权上下文中的数据类型
- 布尔值
-
二进制true
或false
值。在示例中,布尔值 f true
or MfaAuthenticated
表示客户在请求查看订单之前已执行多因素身份验证。
- 设置
-
上下文元素的集合。集合成员可以是完全相同的类型(如本例所示),也可以是不同的类型,包括嵌套的集合。在示例中,客户与 3 个不同的账户相关联。
- String
-
用"
字符括起来的字母、数字或符号序列。在示例中,UserAgent
字符串表示客户用来请求查看其订单的浏览器。
- 长整型
-
一个整数。在示例中,RequestedOrderCount
表示此请求是由于客户要求查看其过去的四个订单而产生的批次的一部分。
- 记录
-
属性的集合。您必须在请求上下文中声明这些属性。带有架构的策略存储区必须在架构中包含该实体和该实体的属性。在示例中,NetworkInfo
记录包含有关用户的原始 IP、由客户端确定的该 IP 的地理位置以及传输中的加密的信息。
- EntityIdentifier
-
对请求entities
元素中声明的实体和属性的引用。在示例中,用户的订单已由员工批准Bob
。
要在示例DigitalPetStore应用程序中测试此示例上下文,您必须更新您的请求entities
、策略存储架构和静态策略,描述为 Customer Role-Get Order。
正在修改 DigitalPetStore 以接受授权上下文
最初,DigitalPetStore不是一个非常复杂的策略存储。它不包含任何预配置的策略或上下文属性来支持我们所呈现的上下文。要使用此上下文信息评估示例授权请求,请对您的策略存储和授权请求进行以下修改。有关以访问令牌信息为上下文的上下文示例,请参阅映射访问令牌。
- Schema
-
对您的策略存储架构应用以下更新以支持新的上下文属性。更新GetOrder
actions
如下。
"GetOrder": {
"memberOf": [],
"appliesTo": {
"resourceTypes": [
"Order"
],
"context": {
"type": "Record",
"attributes": {
"UserAgent": {
"required": true,
"type": "String"
},
"approvedBy": {
"name": "User",
"required": true,
"type": "Entity"
},
"AccountCodes": {
"type": "Set",
"required": true,
"element": {
"type": "Long"
}
},
"RequestedOrderCount": {
"type": "Long",
"required": true
},
"MfaAuthorized": {
"type": "Boolean",
"required": true
}
}
},
"principalTypes": [
"User"
]
}
}
要引用在请求上下文NetworkInfo
中命名的record
数据类型,请在架构中创建一个commonType结构,如下所示。commonType
构造是一组共享的属性,您可以将其应用于不同的实体。
“已验证权限” 可视架构编辑器目前不支持commonType
构造。当您将它们添加到架构中时,您将无法再在可视模式下查看架构。
"commonTypes": {
"NetworkInfo": {
"attributes": {
"IPAddress": {
"type": "String",
"required": true
},
"SSL": {
"required": true,
"type": "Boolean"
},
"Country": {
"required": true,
"type": "String"
}
},
"type": "Record"
}
}
- Policy
-
以下策略设置了每个提供的上下文元素必须满足的条件。它建立在现有静态政策的基础上,描述为 “客户角色-获取订单”。该策略最初仅要求发出请求的委托人是资源的所有者。
permit (
principal in DigitalPetStore::Role::"Customer",
action in [DigitalPetStore::Action::"GetOrder"],
resource
) when {
principal == resource.owner &&
context.MfaAuthorized == true &&
context.UserAgent like "*My UserAgent*" &&
context.RequestedOrderCount <= 4 &&
context.AccountCodes.contains(111122223333) &&
context.NetworkInfo.Country like "*United States*" &&
context.NetworkInfo.SSL == true &&
context.NetworkInfo.IPAddress like "192.0.2.*" &&
context.approvedBy in DigitalPetStore::Role::"Employee"
};
现在,我们要求检索订单的请求必须满足我们在请求中添加的其他上下文条件。
-
用户必须使用登录MFA。
-
用户的 Web 浏览器User-Agent
必须包含字符串My UserAgent
。
-
用户必须请求查看 4 个或更少的订单。
-
用户的账户代码之一必须是111122223333
。
-
用户的 IP 地址必须来自美国,他们必须处于加密会话中,其 IP 地址必须以开头192.0.2.
。
-
员工必须已批准他们的订单。在授权请求的entities
元素中,我们将声明一个角色为的Bob
用户Employee
。
- Request body
-
在使用适当的架构和策略配置策略存储后,您可以向 “已验证权限” API 操作提交此授权请求IsAuthorized。请注意,该entities
区段包含一个角色为的用户的定义Employee
。Bob
{
"principal": {
"entityType": "DigitalPetStore::User",
"entityId": "Alice"
},
"action": {
"actionType": "DigitalPetStore::Action",
"actionId": "GetOrder"
},
"resource": {
"entityType": "DigitalPetStore::Order",
"entityId": "1234"
},
"context": {
"contextMap": {
"MfaAuthorized": {
"boolean": true
},
"UserAgent": {
"string": "My UserAgent 1.12"
},
"RequestedOrderCount":{
"long": 4
},
"AccountCodes": {
"set": [
{"long": 111122223333},
{"long": 444455556666},
{"long": 123456789012}
]
},
"NetworkInfo": {
"record": {
"IPAddress": {"string": "192.0.2.178"},
"Country": {"string": "United States of America"},
"SSL": {"boolean": true}
}
},
"approvedBy": {
"entityIdentifier": {
"entityId": "Bob",
"entityType": "DigitalPetStore::User"
}
}
}
},
"entities": {
"entityList": [
{
"identifier": {
"entityType": "DigitalPetStore::User",
"entityId": "Alice"
},
"attributes": {
"memberId": {
"string": "801b87f2-1a5c-40b3-b580-eacad506d4e6"
}
},
"parents": [
{
"entityType": "DigitalPetStore::Role",
"entityId": "Customer"
}
]
},
{
"identifier": {
"entityType": "DigitalPetStore::User",
"entityId": "Bob"
},
"attributes": {
"memberId": {
"string": "49d9b81e-735d-429c-989d-93bec0bcfd8b"
}
},
"parents": [
{
"entityType": "DigitalPetStore::Role",
"entityId": "Employee"
}
]
},
{
"identifier": {
"entityType": "DigitalPetStore::Order",
"entityId": "1234"
},
"attributes": {
"owner": {
"entityIdentifier": {
"entityType": "DigitalPetStore::User",
"entityId": "Alice"
}
}
},
"parents": []
}
]
},
"policyStoreId": "PSEXAMPLEabcdefg111111"
}