使用ManagedIdentityCredential获取用户分配托管身份令牌遇400错误排查
问题:Azure App Service中使用用户分配托管身份获取令牌时请求缺失client_id参数
我有一个配置了用户分配托管身份(已禁用系统分配托管身份)的Azure App Service。在ASP.NET Core Web应用中使用ManagedIdentityCredential获取访问令牌时抛出异常,依赖遥测显示托管身份端点返回400 Bad Request。
调用凭据对象的代码如下:
var clientID = "<user-assigned-identity-client-id>"; var resourceUrl = "https://<resource-to-be-accessed>"; var credential = new ManagedIdentityCredential(clientID); var context = new TokenRequestContext(new[] { resourceUrl }); return (await credential.GetTokenAsync(context)).Token;
这段代码严格遵循官方文档示例。
遥测显示执行代码时,发送到令牌端点的请求为:
http://127.0.0.1:41776/msi/token/?api-version=2019-08-01&resource=REDACTED
根据REST端点参考文档,该请求应包含client_id查询参数,但实际并未包含。
令人困惑的是:
- 本地设置与生产环境相同的环境变量模拟运行时,请求Uri包含预期的
client_id参数:
http://127.0.0.1:41776/msi/token/?api-version=2019-08-01&resource=https%3A%2F%2F<resource>&client_id=<client-id>
- 在Azure门户的App Service控制台中发送包含
client_id的请求,令牌端点能正常返回有效令牌:
curl -H "X-IDENTITY-HEADER: <header-secret>" -i -s -X GET "http://127.0.0.1:41776/msi/token/?api-version=2019-08-01&resource=https%3A%2F%2F<resource>&client_id=<client-id>"
为何ManagedIdentityCredential类在生产环境中不发送client_id?显然包含该参数就能正常工作。
更新说明
该代码实际可正常工作,问题出在代码中另一处未传入client_id的地方,导致仍能看到“异常”遥测,我错误将其归因于正在修改的代码。留存此内容供他人参考实现方式与验证方法。
内容的提问来源于stack exchange,提问作者Bob Meyers
相关产品推荐
相关产品推荐

