Azure 角色分配条件格式和语法

条件是一项额外检查,你可选择将其添加到角色分配中,以提供更精细的访问控制。 例如,为了读取对象,你可添加要求对象具有特定标记的条件。 本文介绍角色分配条件的格式和语法。

条件格式

为了更好地了解角色分配条件,最好是先了解格式。

简单条件

最基本的条件包含目标操作和表达式。 操作是用户可以针对资源类型执行的操作。 表达式是求值结果为 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'
    )
)

该示意图显示对具有特定容器名称的 Blob 进行的读取访问。

条件的求值方式

如果用户尝试执行角色分配中并非 <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 时你要允许执行的多个操作。 如果为单个条件选择多个操作,则可为条件选择的特性可能较少,因为这些特性必须在所选操作中可用。

条件求值结果为 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 存储或队列存储数据操作的内置或自定义角色分配。 其中包括以下内置角色:

有关可在条件中使用的存储操作的列表,请参阅 Azure Blob 存储的 Azure 角色分配条件的操作和属性Azure 队列的 Azure 角色分配条件的操作和属性

属性

根据所选的操作,特性可能出现在不同的位置。 如果为单个条件选择多个操作,则可为条件选择的特性可能较少,因为这些特性必须在所选操作中可用。 若要指定特性,必须包含源作为前缀。

特性源 说明 代码
资源 指示该特性是资源的特性,例如容器名称。 @Resource
请求 指示该属性是操作请求的一部分,例如设置 blob 索引标记。 @Request
主体 指示属性是主体(例如用户、企业应用程序(服务主体)或托管标识)的 Azure AD 自定义安全属性。 @Principal

资源和请求属性

有关可在条件中使用的 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]
特性支持 加密范围名称
快照
版本 ID

逻辑运算符

本部分列出了可用于构造条件的逻辑运算符。

属性
运算符 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]

布尔比较运算符

本部分列出了可用于构造条件的布尔比较运算符。

属性
运算符 BoolEquals
BoolNotEquals
说明 布尔比较。
示例 @Resource[Microsoft.Storage/storageAccounts:isHnsEnabled] BoolEquals true

字符串比较运算符

本部分列出了可用于构造条件的字符串比较运算符。

StringEquals

属性
运算符 StringEquals
StringEqualsIgnoreCase
说明 区分大小写(或不区分大小写)匹配。 值必须与字符串完全匹配。
示例 @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade'

StringNotEquals

属性
运算符 StringNotEquals
StringNotEqualsIgnoreCase
说明 StringEquals(或 StringEqualsIgnoreCase)运算符求反。

StringStartsWith

属性
运算符 StringStartsWith
StringStartsWithIgnoreCase
说明 区分大小写(或不区分大小写)匹配。 值以字符串开头。

StringNotStartsWith

属性
运算符 StringNotStartsWith
StringNotStartsWithIgnoreCase
说明 StringStartsWith(或 StringStartsWithIgnoreCase)运算符求反。

StringLike

属性
运算符 StringLike
StringLikeIgnoreCase
说明 区分大小写(或不区分大小写)匹配。 值可以包含字符串中任意位置的多字符匹配通配符 (*) 或单字符匹配通配符 (?)。 如果需要,可以通过添加反斜杠 \*\? 来转义这些字符。
示例 @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

属性
运算符 StringNotLike
StringNotLikeIgnoreCase
说明 StringLike(或 StringLikeIgnoreCase)运算符求反。

数值比较运算符

本部分列出了可用于构造条件的数值比较运算符。

属性
运算符 NumericEquals
NumericNotEquals
NumericGreaterThan
NumericGreaterThanEquals
NumericLessThan
NumericLessThanEquals
说明 数字匹配。 仅支持整数。

日期/时间比较运算符

本部分列出了可用于构造条件的日期/时间比较运算符。

属性
运算符 DateTimeEquals
DateTimeNotEquals
DateTimeGreaterThan
DateTimeGreaterThanEquals
DateTimeLessThan
DateTimeLessThanEquals
说明 yyyy-mm-ddThh:mm:ss.mmmmmmmZ 格式的全精度检查。 用于 Blob 版本 ID 和 Blob 快照。
示例 @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:versionId] DateTimeEquals '2022-06-01T00:00:00.0Z'

叉积比较运算符

本部分列出了可用于构造条件的叉积比较运算符。

ForAnyOfAnyValues

属性
运算符 ForAnyOfAnyValues:StringEquals
ForAnyOfAnyValues:StringEqualsIgnoreCase
ForAnyOfAnyValues:StringNotEquals
ForAnyOfAnyValues:StringNotEqualsIgnoreCase
ForAnyOfAnyValues:StringLike
ForAnyOfAnyValues:StringLikeIgnoreCase
ForAnyOfAnyValues:StringNotLike
ForAnyOfAnyValues:StringNotLikeIgnoreCase
ForAnyOfAnyValues:NumericEquals
ForAnyOfAnyValues:NumericNotEquals
ForAnyOfAnyValues:NumericGreaterThan
ForAnyOfAnyValues:NumericGreaterThanEquals
ForAnyOfAnyValues:NumericLessThan
ForAnyOfAnyValues:NumericLessThanEquals
说明 如果左侧至少有一个值满足与右侧至少一个值进行比较的条件,则表达式求值结果为 true。 格式为:ForAnyOfAnyValues:<BooleanFunction>。 支持多个字符串和数字。
示例 @Resource[Microsoft.Storage/storageAccounts/encryptionScopes:name] ForAnyOfAnyValues:StringEquals {'validScope1', 'validScope2'}
如果加密范围名称等于 validScope1validScope2,则为 true。

{'red', 'blue'} ForAnyOfAnyValues:StringEquals {'blue', 'green'}
true

{'red', 'blue'} ForAnyOfAnyValues:StringEquals {'orange', 'green'}
false

ForAllOfAnyValues

属性
运算符 ForAllOfAnyValues:StringEquals
ForAllOfAnyValues:StringEqualsIgnoreCase
ForAllOfAnyValues:StringNotEquals
ForAllOfAnyValues:StringNotEqualsIgnoreCase
ForAllOfAnyValues:StringLike
ForAllOfAnyValues:StringLikeIgnoreCase
ForAllOfAnyValues:StringNotLike
ForAllOfAnyValues:StringNotLikeIgnoreCase
ForAllOfAnyValues:NumericEquals
ForAllOfAnyValues:NumericNotEquals
ForAllOfAnyValues:NumericGreaterThan
ForAllOfAnyValues:NumericGreaterThanEquals
ForAllOfAnyValues:NumericLessThan
ForAllOfAnyValues:NumericLessThanEquals
说明 如果左侧每个值都满足与右侧至少一个值进行比较的条件,则表达式求值结果为 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:StringEquals
ForAnyOfAllValues:StringEqualsIgnoreCase
ForAnyOfAllValues:StringNotEquals
ForAnyOfAllValues:StringNotEqualsIgnoreCase
ForAnyOfAllValues:StringLike
ForAnyOfAllValues:StringLikeIgnoreCase
ForAnyOfAllValues:StringNotLike
ForAnyOfAllValues:StringNotLikeIgnoreCase
ForAnyOfAllValues:NumericEquals
ForAnyOfAllValues:NumericNotEquals
ForAnyOfAllValues:NumericGreaterThan
ForAnyOfAllValues:NumericGreaterThanEquals
ForAnyOfAllValues:NumericLessThan
ForAnyOfAllValues:NumericLessThanEquals
说明 如果左侧至少有一个值满足与右侧每个值进行比较的条件,则表达式求值结果为 true。 格式为:ForAnyOfAllValues:<BooleanFunction>。 支持多个字符串和数字。
示例 {10, 20} ForAnyOfAllValues:NumericLessThan {15, 18}
true

ForAllOfAllValues

属性
运算符 ForAllOfAllValues:StringEquals
ForAllOfAllValues:StringEqualsIgnoreCase
ForAllOfAllValues:StringNotEquals
ForAllOfAllValues:StringNotEqualsIgnoreCase
ForAllOfAllValues:StringLike
ForAllOfAllValues:StringLikeIgnoreCase
ForAllOfAllValues:StringNotLike
ForAllOfAllValues:StringNotLikeIgnoreCase
ForAllOfAllValues:NumericEquals
ForAllOfAllValues:NumericNotEquals
ForAllOfAllValues:NumericGreaterThan
ForAllOfAllValues:NumericGreaterThanEquals
ForAllOfAllValues:NumericLessThan
ForAllOfAllValues:NumericLessThanEquals
说明 如果左侧每个值都满足与右侧每个值进行比较的条件,则表达式求值结果为 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)

后续步骤