客户端对象ID没有权限执行范围内的'Microsoft.Web/serverfarms/read'操作。

22
我正在使用Azure应用服务API查看服务器详细信息,例如工作进程和区域等,以进行管理目的。从AuthenticationContext.AcquireTokenAsync方法生成令牌后,我正在请求以下URL以获取服务器详细信息:https://management.azure.com/subscriptions/<subID>/resourceGroups/<resource group name>/providers/Microsoft.Web/serverfarms/?api-version=2018-02-01

在响应中,我得到了AuthorizationFailed错误代码,其详细信息如下:

客户端未被授权对范围“/subscriptions/xxxxxxxx-xxxxxxx-xxxx/resourceGroups/xxxxxxxxxxx/providers/Microsoft.Web/serverfarms/xxxx”执行操作“Microsoft.Web/serverfarms/read”,或者该范围无效。如果最近已授予访问权限,请刷新您的凭据。

但是当我尝试使用门户网站上的https://learn.microsoft.com/en-us/rest/api/appservice/appserviceenvironments/get进行相同的验证时,请求会返回预期的结果。

因此,是否有其他身份验证方式,或者我需要定义某些权限来实现功能?


2
您用于身份验证的应用程序应在资源、资源组或订阅的访问控制 (IAM) 选项卡中设置必要的 RBAC 角色。 - juunas
4个回答

18

您正在使用的服务主体在该租户中没有权限。

租户拥有订阅,而服务主体属于租户。Azure资源管理器还为给定的主体公开了基于角色的授权,这将使它对Azure资源拥有权限。似乎该服务主体没有读取该订阅的权限。

前往门户,并找到您的订阅,点击访问控制(IAM),然后单击使用获取令牌的相应服务主体添加角色分配

成功授予权限后,请刷新并重试。


在“添加角色分配”中没有可用的Azure资源管理。我有什么遗漏吗? - Abdul Wahab Butt
你有参考我的步骤吗? - Joey Cai
是的,我正在添加订阅访问权限,但在搜索中只找到了 Azure 资源拓扑,并没有你提到的那个。 - Abdul Wahab Butt
你能提供关于 AcquireTokenAsync 的代码吗? - Joey Cai
嗨@Joey,感谢您关于将服务主体添加到订阅的提示。这帮助我解决了问题! - Abdul Wahab Butt
显示剩余2条评论

5

在运行时我遇到了相同的错误,

az aks get-credentials --resource-group myResourceGroup --name myAKSCluster

在运行az login之后不久,我遇到了问题。问题是我没有正确设置我的订阅,所以我需要运行以下命令:

az account set --subscription your-subscription-id

之后,az aks get-credentials 就可以正常工作了,错误已经消失,你将会得到以下输出:

Merged "myAKSCluster" as current context in C:\Users\UserName\.kube\config


我花了一整天的时间排除故障,最终发现我没有设置子程序...唉。谢谢兄弟。 - Marlon

1

由于Azure可能非常复杂,我将尝试将其分解,以便任何人都可以理解。

欢迎每个人对此帖子进行修改,以使其更加清晰易懂。

账户目录

当您创建Azure帐户时,它会创建一个目录(默认目录),目录称为Tenant,您可以拥有多个这样的目录,我认为您甚至可以为每个目录设置单独的登录凭据,就像是完全独立的组织一样,每个目录都有自己的订阅资源组资源/应用程序等。

Your account directories Azure活动目录

每个目录都有自己的 Azure Active Directory,列出了其中的 用户应用程序,这些都是将要访问或在该目录(租户)中执行操作的 客户端/对象

在这种情况下,它是您编写的 应用程序 将在 Azure 资源 上执行任务,为此,客户端(您的应用程序)需要具有适当的 权限 来执行特定的 操作 (您想要执行的任何操作),并直接获准在特定的 资源 上执行它。

enter image description here

首先,您需要创建一个“客户端” - 这是在Azure Active Directory>应用程序注册处注册您的“应用程序”的过程。单击“新注册”,在此处将您的程序“应用程序”注册为您要用于访问Azure“资源”的“客户端”/“对象”,给它一个名字MyApp,单击“注册”,您将获得一个“应用程序(客户端)ID”,您将在代码中使用它作为“客户端ID”,这个“应用程序”现在是您的Azure AD(活动目录)中的“用户”/“服务主体”,现在仍然需要为您想要在某些“资源”上执行的操作授予权限。

前往资源/资源组应用服务/数据库/虚拟机),或者前往订阅(这将授予它访问整个订阅中的所有资源的权限),点击访问控制(IAM) > 添加 > 添加角色分配

Access control (IAM)

  • 在“添加角色分配”屏幕中,选择角色操作,例如 Reader
  • 转到 成员 选项卡,这里我们将选择 服务主体(刚刚注册的应用程序)。
  • 单击“选择成员”,您会看到 AD 用户,但默认情况下,您将无法看到已注册的 AD 应用程序,您需要通过名称搜索它们,请输入您刚刚给出的名称“我的应用程序”。
  • 从下面的列表中选择它,并单击底部的 选择 按钮。
  • 完成分配...

根据下面图像中的数字进行操作。 添加角色分配

现在您应该在应用程序中刷新您的凭据,重新执行授权client的代码,确保使用在Azure注册的app的正确client-ID,对于某些权限,可能需要几分钟才能更新权限,一旦更新完成,您就可以继续进行了。

如果您再次看到AuthorizationFailed,请检查是否仍然是相同的action失败,因为可能还有其他action需要分配给principal以实现您的输出。

希望这能帮助到某些人...祝好运!

以下链接可能会有所帮助:


0

我曾经遇到过同样的问题。起初,我为我的用户添加了“Web Plan Contributor”角色,因为它应该处理这些事情。但是什么都没有改变 - 我仍然遇到了这个错误。

实际问题的原因是一个错误的资源组... 原来我复制了一些旧脚本,其中WebAppPlans在单独的RG中,而我正在那里搜索应用程序计划。完全误导性的错误。我想即使应用程序计划不存在,它也会引发相同的错误消息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接