条件是一项额外检查,你可选择将其添加到角色分配中,以提供更精细的访问控制。 例如,为了读取对象,你可添加要求对象具有特定标记的条件。 本文介绍角色分配条件的格式和语法。
条件格式
为了更好地了解角色分配条件,最好是先了解格式。
简单条件
最基本的条件包含目标操作和表达式。 操作是用户可以针对资源类型执行的操作。 表达式是求值结果为 true 或 false 的语句,此求值结果确定了是否允许执行相应的操作。
下面显示了简单条件的格式。

(
(
!(ActionMatches{'<action>'})
)
OR
(
<attribute> <operator> <value>
)
)
以下条件包含“读取 Blob”操作。 该表达式检查容器名称是否为 blobs-example-container。
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name]
StringEquals 'blobs-example-container'
)
)

条件的求值方式
如果用户尝试执行角色分配中并非 <action> 的操作,则 !(ActionMatches) 的求值结果为 true,并且整个条件的求值结果也为 true,以允许执行该操作。
如果用户尝试执行角色分配中的 <action>,则 !(ActionMatches) 的求值结果为 false,因此将进行表达式求值。 如果表达式求值结果为 true,则整个条件的求值结果将为 true,以允许执行 <action>。 否则不允许执行 <action>。
以下伪代码演示了读取此条件的另一种方式。
if a user tries to perform an action in the role assignment that does not match <action>
{
Allow action to be performed
}
else
{
if <attribute> <operator> <value> is true
{
Allow <action> to be performed
}
else
{
Do not allow <action> to be performed
}
}
子操作
某些操作具有子操作。 例如,Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read 数据操作具有子操作“列出 Blob”。 包含子操作的条件采用以下格式。

(
(
!(ActionMatches{'<action>'}
AND
SubOperationMatches{'<subOperation>'})
)
OR
(
<attribute> <operator> <value>
)
)
多个操作
一个条件可以包含当其求值结果为 true 时你要允许执行的多个操作。 如果为单个条件选择多个操作,则可为条件选择的特性可能较少,因为这些特性必须在所选操作中可用。

(
(
!(ActionMatches{'<action>'})
AND
!(ActionMatches{'<action>'})
)
OR
(
<attribute> <operator> <value>
)
)
多个表达式
一个条件可以包含多个表达式。 可以根据运算符针对多个值检查特性。

(
(
!(ActionMatches{'<action>'})
)
OR
(
<attribute> <operator> <value>
AND | OR
<attribute> <operator> {<value>, <value>, <value>}
AND | OR
<attribute> <operator> <value>
)
)
多个条件
还可以组合多个条件以将多个操作指定为目标。

(
(
!(ActionMatches{'<action>'})
)
OR
(
<attribute> <operator> <value>
AND | OR
<attribute> <operator> {<value>, <value>, <value>}
AND | OR
<attribute> <operator> <value>
)
)
AND
(
(
!(ActionMatches{'<action>'})
)
OR
(
<attribute> <operator> <value>
AND | OR
<attribute> <operator> <value>
)
)
条件语法
下面显示了角色分配条件的语法。
(
(
!(ActionMatches{'<action>'} AND SubOperationMatches{'<subOperation>'})
AND
!(ActionMatches{'<action>'} AND SubOperationMatches{'<subOperation>'})
AND
...
)
OR
(
<attribute> <operator> {<value, <value>, ...}
AND | OR
<attribute> <operator> {<value>, <value>, ...}
AND | OR
...
)
)
AND
(
(
!(ActionMatches{'<action>'} AND SubOperationMatches{'<subOperation>'})
AND
!(ActionMatches{'<action>'} AND SubOperationMatches{'<subOperation>'})
AND
...
)
OR
(
<attribute> <operator> {<value, <value>, ...}
AND | OR
<attribute> <operator> {<value>, <value>, ...}
AND | OR
...
)
)
AND
...
操作
目前,可将条件添加到包含 Blob 存储或队列存储数据操作的内置或自定义角色分配。 其中包括以下内置角色:
有关可在条件中使用的存储操作列表,请参阅:
属性
根据所选的操作,特性可能出现在不同的位置。 如果为单个条件选择多个操作,则能为条件选择的属性可能较少,因为这些属性必须在全部所选操作中可用。 若要指定特性,必须包含源作为前缀。
| 特性源 | 说明 | 代码 |
|---|---|---|
| 环境 | 属性与请求的环境相关联,例如请求的网络源或当前日期和时间。 |
@Environment |
| 主体 | 属性是分配给主体的自定义安全属性,例如用户或企业应用程序(服务主体)。 | @Principal |
| 请求 | 属性是操作请求的一部分,例如设置 blob 索引标记。 | @Request |
| 资源 | 属性是资源的属性,例如容器名称。 | @Resource |
有关可在条件中使用的存储属性的完整列表,请参阅:
环境属性
环境属性与发出访问请求的环境相关联,例如日期和时间或网络环境。 网络环境可能指明是通过特定专用终结点或虚拟网络子网进行访问,还是可能通过任何专用链接进行访问。
下表列出了条件支持的环境属性。
| Display name | 说明 | 属性 | 类型 |
|---|---|---|---|
| 是专用链接1 | 在条件中使用此属性来要求通过任何专用链接进行访问。 | isPrivateLink |
布尔值 |
| 专用终结点1,2 | 在条件中使用此属性限制通过特定专用终结点进行的访问。 | Microsoft.Network/privateEndpoints |
字符串 |
| 子网1,3 | 在条件中使用此属性限制来自特定子网的访问。 | Microsoft.Network/virtualNetworks/subnets |
字符串 |
| 现在 (UTC) | 在条件中使用此属性来限制在特定时间段内对对象的访问。 | UtcNow |
DateTime |
1 对于复制操作,Is private link、Private endpoint 和 Subnet 属性仅适用于目标(例如存储帐户),而不适用于源。 有关适用的复制操作的详细信息,请选择表中的每个属性以查看更多详细信息。
2 仅当目前至少在订阅中配置了一个专用终结点时,才能使用 Private endpoint 属性。
3 仅当你当前至少有一个使用订阅中配置的服务终结点的虚拟网络子网时,才可以使用 Subnet 属性。
主体属性
主体属性是自定义安全属性,分配给请求访问资源的安全主体。 安全主体可以是用户或企业应用程序(服务主体)。
要使用主体属性,必须具备以下各项:
- 登录用户的 Microsoft Entra 权限,例如属性分配管理员角色
- Microsoft Entra ID 中定义的自定义安全属性
有关自定义安全属性的详细信息,请参阅:
请求属性
请求属性与访问请求中指定的条件相关联,例如要列出的 Blob 的指定前缀。
资源属性
资源属性与请求访问的对象相关联,例如存储帐户名称、容器名称或是否为存储帐户启用分层命名空间。
函数运算符
本部分列出了可用于构造条件的函数运算符。
ActionMatches
| 属性 | 值 |
|---|---|
| “运算符” | ActionMatches |
| 说明 | 检查当前操作是否与指定的操作模式匹配。 |
| 示例 | ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'}如果所要检查的操作等于“Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read”,则为 true ActionMatches{'Microsoft.Authorization/roleAssignments/*'}如果所要检查的操作等于“Microsoft.Authorization/roleAssignments/write”,则为 true ActionMatches{'Microsoft.Authorization/roleDefinitions/*'}如果所要检查的操作等于“Microsoft.Authorization/roleAssignments/write”,则为 false |
SubOperationMatches
| 属性 | 值 |
|---|---|
| “运算符” | SubOperationMatches |
| 说明 | 检查当前子操作是否与指定的子操作模式匹配。 |
| 示例 | SubOperationMatches{'Blob.List'} |
Exists
| 属性 | 值 |
|---|---|
| “运算符” | Exists |
| 说明 | 检查指定的特性是否存在。 |
| 示例 | Exists @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:snapshot] |
| 属性支持 1 | 加密范围名称 快照 版本 ID |
1 在 Azure 门户上的视觉 ABAC 条件生成器中,只有这些属性支持 Exists 运算符。 可以使用 PowerShell、Azure CLI、REST API 以及 Azure 门户中的条件代码编辑器等其他工具将 Exists 运算符添加到任何属性中。
逻辑运算符
本部分列出了可用于构造条件的逻辑运算符。
且
| 属性 | 值 |
|---|---|
| 运算符 | AND&& |
| 说明 | “与”运算符。 |
| 示例 | !(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'}) |
或
| 属性 | 值 |
|---|---|
| 运算符 | OR|| |
| 说明 | “或”运算符。 |
| 示例 | @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:versionId] DateTimeEquals '2022-06-01T00:00:00.0Z' OR NOT Exists @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:versionId |
Not
| 属性 | 值 |
|---|---|
| 运算符 | NOT! |
| 说明 | “非”或求反运算符。 |
| 示例 | NOT Exists @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:versionId] |
布尔比较运算符
本部分列出了可用于构造条件的布尔比较运算符。
| 属性 | 值 |
|---|---|
| 运算符 | BoolEqualsBoolNotEquals |
| 说明 | 布尔比较。 |
| 示例 | @Resource[Microsoft.Storage/storageAccounts:isHnsEnabled] BoolEquals true |
字符串比较运算符
本部分列出了可用于构造条件的字符串比较运算符。
StringEquals
| 属性 | 值 |
|---|---|
| 运算符 | StringEqualsStringEqualsIgnoreCase |
| 说明 | 区分大小写(或不区分大小写)匹配。 值必须与字符串完全匹配。 |
| 示例 | @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade' |
StringNotEquals
| 属性 | 值 |
|---|---|
| 运算符 | StringNotEqualsStringNotEqualsIgnoreCase |
| 说明 | StringEquals(或 StringEqualsIgnoreCase)运算符求反。 |
StringStartsWith
| 属性 | 值 |
|---|---|
| 运算符 | StringStartsWithStringStartsWithIgnoreCase |
| 说明 | 区分大小写(或不区分大小写)匹配。 值以字符串开头。 |
StringNotStartsWith
| 属性 | 值 |
|---|---|
| 运算符 | StringNotStartsWithStringNotStartsWithIgnoreCase |
| 说明 | StringStartsWith(或 StringStartsWithIgnoreCase)运算符求反。 |
StringLike
| 属性 | 值 |
|---|---|
| 运算符 | StringLikeStringLikeIgnoreCase |
| 说明 | 区分大小写(或不区分大小写)匹配。 值可以包含字符串中任意位置的多字符匹配通配符 (*) 或单字符匹配通配符 (?)。 如果需要,可以通过添加反斜杠 \* 和 \? 来转义这些字符。 |
| 示例 | @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:path] StringLike 'readonly/*'Resource[name1] StringLike 'a*c?'如果 Resource [name1] 等于“abcd”,则结果为 true Resource[name1] StringLike 'A*C?'如果 Resource [name1] 等于“abcd”,则结果为 false Resource[name1] StringLike 'a*c'如果 Resource [name1] 等于“abcd”,则结果为 false |
StringNotLike
| 属性 | 值 |
|---|---|
| 运算符 | StringNotLikeStringNotLikeIgnoreCase |
| 说明 | StringLike(或 StringLikeIgnoreCase)运算符求反。 |
数值比较运算符
本部分列出了可用于构造条件的数值比较运算符。
| 属性 | 值 |
|---|---|
| 运算符 | NumericEqualsNumericNotEqualsNumericGreaterThanNumericGreaterThanEqualsNumericLessThanNumericLessThanEquals |
| 说明 | 数字匹配。 仅支持整数。 |
日期/时间比较运算符
本部分列出了可用于构造条件的日期/时间比较运算符。
| 属性 | 值 |
|---|---|
| 运算符 | DateTimeEqualsDateTimeNotEqualsDateTimeGreaterThanDateTimeGreaterThanEqualsDateTimeLessThanDateTimeLessThanEquals |
| 说明 | yyyy-mm-ddThh:mm:ss.mmmmmmmZ 格式的全精度检查。 现在用于 Blob 版本 ID、Blob 快照和 UTC。 |
| 示例 | @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:versionId] DateTimeEquals '2022-06-01T00:00:00.0Z' |
GUID 比较运算符
本部分列出了可用于构造条件的全局唯一标识符 (GUID) 比较运算符。
| 属性 | 值 |
|---|---|
| 运算符 | GuidEqualsGuidNotEquals |
| 描述 | 不区分大小写的匹配格式:00000000-0000-0000-0000-000000000000。 用于标识资源,例如主体 ID 或角色定义 ID。 |
| 示例 |
叉积比较运算符
本部分列出了可用于构造条件的叉积比较运算符。
ForAnyOfAnyValues
| 属性 | 值 |
|---|---|
| 运算符 | ForAnyOfAnyValues:StringEqualsForAnyOfAnyValues:StringEqualsIgnoreCaseForAnyOfAnyValues:StringNotEqualsForAnyOfAnyValues:StringNotEqualsIgnoreCaseForAnyOfAnyValues:StringLikeForAnyOfAnyValues:StringLikeIgnoreCaseForAnyOfAnyValues:StringNotLikeForAnyOfAnyValues:StringNotLikeIgnoreCaseForAnyOfAnyValues:NumericEqualsForAnyOfAnyValues:NumericNotEqualsForAnyOfAnyValues:NumericGreaterThanForAnyOfAnyValues:NumericGreaterThanEqualsForAnyOfAnyValues:NumericLessThanForAnyOfAnyValues:NumericLessThanEqualsForAnyOfAnyValues:GuidEqualsForAnyOfAnyValues:GuidNotEquals |
| 说明 | 如果左侧至少有一个值满足与右侧至少一个值进行比较的条件,则表达式求值结果为 true。 格式为:ForAnyOfAnyValues:<BooleanFunction>。 支持多个字符串和数字。 |
| 示例 | @Resource[Microsoft.Storage/storageAccounts/encryptionScopes:name] ForAnyOfAnyValues:StringEquals {'validScope1', 'validScope2'}如果加密范围名称等于 validScope1 或 validScope2,则为 true。{'red', 'blue'} ForAnyOfAnyValues:StringEquals {'blue', 'green'}true {'red', 'blue'} ForAnyOfAnyValues:StringEquals {'orange', 'green'}false |
ForAllOfAnyValues
| 属性 | 值 |
|---|---|
| 运算符 | ForAllOfAnyValues:StringEqualsForAllOfAnyValues:StringEqualsIgnoreCaseForAllOfAnyValues:StringNotEqualsForAllOfAnyValues:StringNotEqualsIgnoreCaseForAllOfAnyValues:StringLikeForAllOfAnyValues:StringLikeIgnoreCaseForAllOfAnyValues:StringNotLikeForAllOfAnyValues:StringNotLikeIgnoreCaseForAllOfAnyValues:NumericEqualsForAllOfAnyValues:NumericNotEqualsForAllOfAnyValues:NumericGreaterThanForAllOfAnyValues:NumericGreaterThanEqualsForAllOfAnyValues:NumericLessThanForAllOfAnyValues:NumericLessThanEqualsForAllOfAnyValues:GuidEqualsForAllOfAnyValues:GuidNotEquals |
| 说明 | 如果左侧每个值都满足与右侧至少一个值进行比较的条件,则表达式求值结果为 true。 格式为:ForAllOfAnyValues:<BooleanFunction>。 支持多个字符串和数字。 |
| 示例 | @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>] ForAllOfAnyValues:StringEquals {'Cascade', 'Baker', 'Skagit'}{'red', 'blue'} ForAllOfAnyValues:StringEquals {'orange', 'red', 'blue'}true {'red', 'blue'} ForAllOfAnyValues:StringEquals {'red', 'green'}false |
ForAnyOfAllValues
| 属性 | 值 |
|---|---|
| 运算符 | ForAnyOfAllValues:StringEqualsForAnyOfAllValues:StringEqualsIgnoreCaseForAnyOfAllValues:StringNotEqualsForAnyOfAllValues:StringNotEqualsIgnoreCaseForAnyOfAllValues:StringLikeForAnyOfAllValues:StringLikeIgnoreCaseForAnyOfAllValues:StringNotLikeForAnyOfAllValues:StringNotLikeIgnoreCaseForAnyOfAllValues:NumericEqualsForAnyOfAllValues:NumericNotEqualsForAnyOfAllValues:NumericGreaterThanForAnyOfAllValues:NumericGreaterThanEqualsForAnyOfAllValues:NumericLessThanForAnyOfAllValues:NumericLessThanEqualsForAnyOfAllValues:GuidEqualsForAnyOfAllValues:GuidNotEquals |
| 说明 | 如果左侧至少有一个值满足与右侧每个值进行比较的条件,则表达式求值结果为 true。 格式为:ForAnyOfAllValues:<BooleanFunction>。 支持多个字符串和数字。 |
| 示例 | {10, 20} ForAnyOfAllValues:NumericLessThan {15, 18}是 |
ForAllOfAllValues
| 属性 | 值 |
|---|---|
| 运算符 | ForAllOfAllValues:StringEqualsForAllOfAllValues:StringEqualsIgnoreCaseForAllOfAllValues:StringNotEqualsForAllOfAllValues:StringNotEqualsIgnoreCaseForAllOfAllValues:StringLikeForAllOfAllValues:StringLikeIgnoreCaseForAllOfAllValues:StringNotLikeForAllOfAllValues:StringNotLikeIgnoreCaseForAllOfAllValues:NumericEqualsForAllOfAllValues:NumericNotEqualsForAllOfAllValues:NumericGreaterThanForAllOfAllValues:NumericGreaterThanEqualsForAllOfAllValues:NumericLessThanForAllOfAllValues:NumericLessThanEqualsForAllOfAllValues:GuidEqualsForAllOfAllValues:GuidNotEquals |
| 说明 | 如果左侧每个值都满足与右侧每个值进行比较的条件,则表达式求值结果为 true。 格式为:ForAllOfAllValues:<BooleanFunction>。 支持多个字符串和数字。 |
| 示例 | {10, 20} ForAllOfAllValues:NumericLessThan {5, 15, 18}false {10, 20} ForAllOfAllValues:NumericLessThan {25, 30}true {10, 20} ForAllOfAllValues:NumericLessThan {15, 25, 30}false |
特殊字符
| 字符 | 说明 |
|---|---|
* |
星号 (*) 表示可与 Like 运算符结合使用的多字符通配符匹配。 如果需要,可以通过添加反斜杠 \* 来转义星号。 |
? |
问号 (?) 表示可与 Like 运算符结合使用的单字符通配符匹配。 如果需要,可以通过添加反斜杠 \? 来转义问号。 |
$ |
美元符号 ($) 用于帮助描述标记键。 在 Azure PowerShell 中,如果用双引号 (") 括起来的字符串包含美元符号,则必须为其添加反引号 (`) 作为前缀。 例如: tags:Project<`$key_case_sensitive`$>。 |
组合与优先级
如果目标操作有三个或多个表达式,并且表达式之间有不同的运算符,则求值顺序不明确。 可以使用括号 () 对表达式进行分组并指定表达式的求值顺序。 括在括号中的表达式优先级更高。 例如,如果有以下表达式:
a AND b OR c
必须按以下方式之一添加括号:
(a AND b) OR c
a AND (b OR c)