多租户应用调用Azure管理API获取订阅返回空值问题排查
排查Azure管理API返回空订阅列表的问题
这种情况我之前碰过好几次,大概率是以下几个配置环节没到位,咱们一步步排查:
应用权限的「管理员同意」没授予
就算你在应用注册里加了Subscription.Read.All这类Azure管理API的应用权限,也必须由租户管理员点击「授予[租户名]的管理员同意」才能生效。操作路径是:Azure Portal → Azure AD → 应用注册 → 你的应用 → 「API权限」页面 → 顶部的「授予管理员同意」按钮。没这一步的话,API会返回空列表,因为权限根本没生效。JWT令牌的受众或作用域不正确
调用Azure管理API时,令牌的aud(受众)必须是https://management.azure.com/,而且用客户端凭据流(应用ID+密钥)的话,请求令牌时的scope参数得是https://management.azure.com/.default。
你可以解码一下你的JWT(用jwt.ms就行),检查这两个点:aud字段是不是https://management.azure.com/,要是写成Graph API的地址就完全不对;roles字段里有没有你配置的权限(比如Subscription.Read.All),没有的话说明权限没被正确授予。
多租户应用的租户访问权限受限
如果是多租户应用,目标租户必须先同意该应用访问其资源才行。默认情况下,多租户应用需要目标租户的管理员完成同意操作,应用才会出现在目标租户的「企业应用」列表里,才能访问该租户的订阅数据。API版本或端点问题
你用的2016-06-01版本虽然还能用,但可以试试最新的稳定版2020-01-01,有时候旧版本在权限校验逻辑上会有差异。修改后的请求端点是:https://management.azure.com/subscriptions?api-version=2020-01-01客户端凭据流的参数是否正确
确认你获取令牌时用的是客户端凭据流,参数要符合要求:grant_type必须是client_credentials;scope是https://management.azure.com/.default;tenant是目标租户的ID;client_id和client_secret要和应用注册里的一致,别写错或者用了过期的密钥。
内容的提问来源于stack exchange,提问作者Dandy
相关产品推荐
相关产品推荐

