你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

排查 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.

原因

条件的格式不正确。

解决方案

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

可视化编辑器中的问题

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

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

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

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

若要使用主体(用户)属性,必须具有以下所有项: Azure AD Premium P1 或 P2 许可证、Azure AD 权限(如属性分配管理员角色)以及 Azure AD 中定义的自定义安全属性。

显示添加条件时主体消息的屏幕截图。

原因

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

  • Azure AD Premium P1 或 P2 许可证
  • Azure AD 权限可以让已登录用户读取至少一个属性集
  • Azure AD 中定义的自定义安全属性

解决方案

  1. 打开“Azure Active Directory”>“自定义安全属性”。

    如果“自定义安全属性”页面被禁用,则表明你没有 Azure AD Premium P1 或 P2 许可证。 打开“Azure Active Directory”>“概述”,并检查租户的许可证。

    屏幕截图显示 Azure 门户中已禁用“自定义安全属性”页。

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

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

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

    重要

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

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

    完成后,你应该至少能够读取一个属性集。 添加带条件的角色分配时,“主体”现在应该出现在“属性源”列表中。

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

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

使用 Azure AD 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.

原因

当前存在表达式,但尚未选择任何操作。

解决方案

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

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

后续步骤