你当前正在访问 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 中定义的自定义安全属性
解决方案
打开“Azure Active Directory”>“自定义安全属性”。
如果“自定义安全属性”页面被禁用,则表明你没有 Azure AD Premium P1 或 P2 许可证。 打开“Azure Active Directory”>“概述”,并检查租户的许可证。
如果看到“入门”页,则表明你无权读取至少一个属性集,或者自定义安全属性尚未定义。
如果已定义自定义安全属性,请在租户范围或属性集范围内分配以下角色之一。 有关详细信息,请参阅管理 Azure AD 中的自定义安全属性的访问权限。
重要
默认情况下,全局管理员和其他管理员角色无权读取、定义或分配自定义安全属性。
如果尚未定义自定义安全属性,请在租户范围内分配属性定义管理员角色并添加自定义安全属性。 有关详细信息,请参阅在 Azure AD 中添加或停用自定义安全属性。
完成后,你应该至少能够读取一个属性集。 添加带条件的角色分配时,“主体”现在应该出现在“属性源”列表中。
故障描述 - 使用 PIM 时,主体未出现在属性源中
使用 Azure AD Privileged Identity Management (PIM) 尝试添加带有条件的角色分配时,“主体”未出现在“属性源”列表中。
原因
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
。