排查 Azure 角色分配条件的问题

常规问题

症状 - 条件未强制实施

原因 1

安全主体在相同或更高的范围具有一个或多个角色分配。

解决方案 1

确保安全主体不存在多个对同一数据操作授予访问权限、导致不强制实施条件的角色分配(带有或不带有条件)。 有关评估逻辑的信息,请参阅 Azure RBAC 如何确定用户是否有权访问某个资源

原因 2

你的角色分配包含多个授予权限的操作,并且你的条件不是以所有操作为目标。 例如,如果你有 /blobs/write/blobs/add/action 数据操作,则可以创建 Blob。 如果你的角色分配包含这两个数据操作,并且你只在条件中以其中一个操作为目标,则该角色分配将授权创建 Blob,并绕过该条件。

解决方案 2

如果你的角色分配包含多个授予权限的操作,请确保以所有相关操作为目标。

原因 3

在角色分配中添加条件时,最多可能需要 5 分钟时间,该条件才会强制实施。 添加条件时,资源提供程序(例如 Microsoft 存储)会收到更新通知。 资源提供程序将立即对其本地缓存进行更新,以确保使用最新的角色分配。 此过程将在 1 到 2 分钟内完成,但最长可能需要 5 分钟。

解决方法 3

等待 5 分钟,然后再次测试条件。

症状 - 添加条件时出现“条件无效”错误

尝试添加带有条件的角色分配时,出现如下所示的错误:

The given role assignment condition is invalid.

原因 1

conditionVersion 属性设置为“1.0”。

解决方案 1

conditionVersion 属性设置为“2.0”。

原因 2

条件的格式不正确。

解决方案 2

解决任何条件格式或语法问题。 或者,使用 Azure 门户中的视觉编辑器添加条件。

可视化编辑器中的问题

症状 - 主体未出现在属性源中

尝试添加带有条件的角色分配时,“主体”未出现在“属性源”列表中。

显示添加条件时属性源列表中的主体的屏幕截图。

相反,你会看到以下消息:

To use principal (user) attributes, you must have Microsoft Entra permissions (such as the [Attribute Assignment Administrator](../active-directory/roles/permissions-reference.md#attribute-assignment-administrator) role) and custom security attributes defined in Microsoft Entra ID.

原因

你不符合先决条件。 若要使用主体属性,必须具备以下各项:

  • 登录用户读取至少一个属性集的 Microsoft Entra 权限
  • Microsoft Entra ID 中定义的自定义安全属性

解决方案

  1. 打开“Microsoft Entra ID”>“自定义安全属性”。

    如果看到“入门”页,则表明你无权读取至少一个属性集,或者自定义安全属性尚未定义。

    屏幕截图显示自定义安全属性“入门”页。

  2. 如果已定义自定义安全属性,请在租户范围或属性集范围内分配以下角色之一。 有关详细信息,请参阅管理对 Microsoft Entra ID 中自定义安全属性的访问

    重要

    默认情况下,全局管理员和其他管理员角色无权读取、定义或分配自定义安全属性。

  3. 如果尚未定义自定义安全属性,请在租户范围内分配属性定义管理员角色并添加自定义安全属性。 有关详细信息,请参阅在 Microsoft Entra ID 中添加或停用自定义安全属性

    完成后,你应该至少能够读取一个属性集。

    屏幕截图显示可供用户读取的属性集。

    添加带条件的角色分配时,“主体”现在应该出现在“属性源”列表中。

故障描述 - 使用 PIM 时,主体未出现在属性源中

当你尝试使用 Microsoft Entra Privileged Identity Management (PIM) 添加具有条件的角色分配时,“主体”不会显示在“属性源”列表中。

显示在使用 Privileged Identity Management 添加条件时属性源列表中的主体的屏幕截图。

原因

PIM 目前不支持在角色分配条件中使用主体属性。

可视化编辑器中的错误消息

故障描述 - 无法识别条件

使用代码编辑器后,切换到视觉编辑器时出现如下所示的消息:

The current expression cannot be recognized. Switch to the code editor to edit the expression or delete the expression and add a new one.

原因

更新了该条件,使得视觉编辑器无法对其进行分析。

解决方案

解决任何条件格式或语法问题。 或者,可以删除该条件,然后重试。

故障描述 - 属性没有为以前保存的条件应用错误

在可视化编辑器中打开以前保存的条件时,会收到以下消息:

Attribute does not apply for the selected actions. Select a different set of actions.

原因

2022 年 5 月,“读取 Blob”操作已从以下格式进行更改:

!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})

若要排除 Blob.List 子操作,请执行以下命令:

!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})

如果在 2022 年 5 月之前创建了包含“读取 Blob”操作的条件,则可能会在可视化编辑器中看到此错误消息。

解决方案

打开“选择操作”窗格,然后重新选择“读取 Blob”操作。

故障描述 - 属性没有应用错误

在可视化编辑器中使用现有表达式选择一个或多个操作时,将收到以下消息,并移除先前选择的属性:

Attribute does not apply for the selected actions. Select a different set of actions.

原因

以前选择的属性不再应用于当前选定的操作。

解决方案 1

在“添加操作”部分,选择应用于所选属性的操作。 有关每个存储属性支持的存储操作的列表,请参阅 Azure Blob 存储的 Azure 角色分配条件的操作和属性Azure 队列的 Azure 角色分配条件的操作和属性

解决方案 2

在“生成表达式”部分,选择应用于当前所选操作的属性。 有关每个存储操作支持的存储属性的列表,请参阅 Azure Blob 存储的 Azure 角色分配条件的操作和属性Azure 队列的 Azure 角色分配条件的操作和属性

故障描述 - 属性在此上下文警告中不适用

在代码编辑器中进行编辑,然后切换到可视化编辑器时,将收到以下消息,并移除之前选择的属性:

Attribute does not apply in this context. Use a different role assignment scope or remove the expression.

原因

指定的属性在当前范围内不可用,例如,在启用了分层命名空间的存储帐户中使用 Version ID 时就是如此。

解决方案

如果要使用当前指定的属性,请在其他范围(例如资源组范围)创建角色分配条件。 或者,使用当前选定的操作移除再重新创建表达式。

故障描述 -“无法识别属性”错误

在代码编辑器中进行编辑,然后切换到可视化编辑器时,将收到以下消息,并移除之前选择的属性:

Attribute is not recognized. Select a valid attribute or remove the expression.

原因

无法识别指定的属性,可能是因为拼写有误。

解决方案

在代码编辑器中,修正拼写错误。 或者,移除现有表达式,并使用可视化编辑器选择属性。

故障描述 -“属性值无效”错误

在代码编辑器中进行编辑,然后切换到可视化编辑器时,将收到以下消息,并移除之前选择的属性:

Attribute value is invalid. Select another attribute or value.

原因

表达式的右侧包含无效的属性或值。

解决方案

请使用可视化编辑器选择属性或指定值。

故障描述 -“未选择任何操作”错误

移除可视化编辑器中的所有操作时,会收到以下消息:

No actions selected. Select one or more actions to edit expressions.

原因

存在现有表达式,但尚未选择任何操作作为目标。

解决方案

在“添加操作”部分,添加该表达式应面向的一个或多个操作。

症状 - 无可用选项错误

尝试添加表达式时,会收到以下消息:

No options available

原因

你已选择面向多个操作,并且没有任何属性适用于当前选择的所有操作。

解决方案

添加操作部分,选择要面向的较少操作。 要面向删除的操作,请添加多个条件。

症状 - 找不到角色定义 ID

尝试添加表达式时,会收到以下消息:

Cannot find built-in or custom role definitions with IDs: <role IDs>. These IDs were removed. Check that the IDs are valid and try to add again. You can also refresh the page or sign out and sign in again.

原因

找不到你尝试为角色定义 ID 属性添加的一个或多个角色定义 ID,或者它们没有正确的 GUID 格式:00000000-0000-0000-0000-000000000000

解决方案

使用条件编辑器选择角色。 如果最近添加了自定义角色,请刷新页面或注销并再次登录。

症状 - 找不到主体 ID

尝试添加表达式时,会收到以下消息:

Cannot find users, groups, or service principals in Azure Active Directory with principal IDs: <principal IDs>. These IDs were removed. Check that the IDs are valid and try to add again. You can also refresh the page or sign out and sign in again.

原因

找不到你尝试为主体 ID 属性添加的一个或多个主体 ID,或者它们没有正确的 GUID 格式:00000000-0000-0000-0000-000000000000

解决方案

使用条件编辑器选择主体。 如果最近添加了主体,请刷新页面或注销并再次登录。

Azure PowerShell 中的错误消息

故障描述 -“资源属性无效”错误

尝试使用 Azure PowerShell 添加带有条件的角色分配时,出现如下所示的错误:

New-AzRoleAssignment : Resource attribute
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$> is not valid.

原因

如果条件包含美元符号 ($),则必须使用反撇号 (`) 作为其前缀。

解决方案

在每个美元符号前添加一个反撇号 (`)。 下面显示了一个示例。 有关 PowerShell 中的引号规则的详细信息,请参阅关于引号规则

$condition = "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<`$key_case_sensitive`$>] StringEquals 'Cascade'))"

症状 - 复制并粘贴条件时出错

原因

如果使用 PowerShell 从文档复制条件,它可能包含导致以下错误的特殊字符。 某些编辑器(例如 Microsoft Word)在设置不显示的文本的格式时,会添加控制字符。

The given role assignment condition is invalid.

解决方案

如果从富文本编辑器中复制了一个条件并且确定该条件是正确的,请删除所有空格并返回,然后重新添加相关的空格。 也可使用纯文本编辑器或代码编辑器,例如 Visual Studio Code。

Azure CLI 中的错误消息

故障描述 -“资源属性无效”错误

尝试使用 Azure CLI 添加带有条件的角色分配时,出现如下所示的错误:

Resource attribute Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$> is not valid.

原因

如果条件包含美元符号 ($),则必须使用反斜杠 (\) 作为其前缀。

解决方案

在每个美元符号前添加一个反斜杠 (\)。 下面显示了一个示例。 如需详细了解 Bash 中引号的规则,请参阅双引号

condition="((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<\$key_case_sensitive\$>] StringEquals 'Cascade'))"

故障描述 -“无法识别参数”错误

尝试使用 Azure CLI 添加带有条件的角色分配时,出现如下所示的错误:

az: error: unrecognized arguments: --description {description} --condition {condition} --condition-version 2.0

原因

你可能正在使用早期版本的 Azure CLI,该版本不支持角色分配条件参数。

解决方案

更新到最新的 Azure CLI 版本(2.18 或更高版本)。 有关详细信息,请参阅安装 Azure CLI

症状 - 在 Bash 中将条件字符串分配到变量时出错

尝试在 Bash 中将条件字符串分配到变量时出现 bash: !: event not found 消息。

原因

在 Bash 中,如果启用历史记录扩展,则可能会看到消息 bash: !: event not found,因为有感叹号 (!)。

解决方案

使用命令 set +H 禁用历史记录扩展。 若要重新启用历史记录扩展,请使用 set -H

后续步骤