如何通过用户分配托管标识获取令牌以调用REST API完成Azure蓝图分配
刚好碰到过类似的场景,我来给你一步步讲清楚怎么用这个没有客户端密钥的用户分配托管标识拿到访问令牌,进而完成Azure蓝图的API分配。
核心思路
首先要明确:用户分配托管标识本身不需要客户端密钥,Azure已经为它提供了安全的令牌获取方式,主要分两种场景——运行在Azure资源上(生产环境)和本地调试。
场景1:你的应用/代码运行在Azure资源上(生产推荐)
如果你的程序部署在Azure VM、Function App、App Service这类资源上,直接用Azure Instance Metadata Service (IMDS) 来获取令牌就可以,步骤如下:
- 关联托管标识到你的Azure资源
比如给VM添加身份:在VM的「身份」选项卡切换到「用户分配」,点击「添加」,选择你提供的这个托管标识(名字是xxx)保存。Function/App Service的话,在配置的「身份」部分启用用户分配标识并关联它。 - 调用IMDS端点获取令牌
发送GET请求到IMDS的令牌端点,指定目标资源(Azure管理API的资源ID是https://management.azure.com/)和你的托管标识clientId:
响应里的curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/&client_id=xxx' \ -H "Metadata: true"access_token字段就是你需要的有效令牌,有效期默认1小时,可直接用于后续的蓝图API调用。
场景2:本地调试(用Azure CLI模拟)
如果你在本地开发测试,不想部署到Azure,可以用Azure CLI来获取这个托管标识的令牌:
- 确保你的登录账号有权限
你需要拥有这个用户分配托管标识的Managed Identity Operator权限,或者更高的权限(比如所有者),这样才能代表它获取令牌。 - 执行CLI命令获取令牌
命令返回的JSON里的az account get-access-token \ --resource https://management.azure.com/ \ --identity \ --username <你的托管标识clientId>accessToken就是可用的令牌,同样可以用于API调用。
调用Azure蓝图分配API
拿到令牌后,在API请求的请求头里添加授权信息:
Authorization: Bearer <你的access_token>
然后按照Azure蓝图API的要求构造请求体,发送POST请求到对应的分配API端点(比如针对订阅级的分配:https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.Blueprint/blueprintAssignments/{assignmentName}?api-version=2018-11-01-preview)。
关键注意事项
- 权限配置:一定要确保这个用户分配托管标识拥有足够的权限来完成蓝图分配,至少需要
Blueprint Assignment Contributor角色在目标订阅/资源组上。 - IMDS限制:IMDS端点只能在Azure内部资源访问,本地环境无法直接调用,所以本地调试必须用CLI方法。
- 令牌有效性:令牌有效期1小时,过期后需要重新获取,建议在代码里实现自动刷新逻辑。
内容的提问来源于stack exchange,提问作者fasho
相关产品推荐
相关产品推荐

