Azure App Service中如何通过DefaultAzureCredential获取App Registration的Bearer Token?
问题:Azure App Service使用DefaultAzureCredential获取带角色的令牌(无客户端密钥)
问题背景
在Entra租户中有两个应用注册,其中一个已被授权调用另一个。使用客户端密钥通过grant_type=client_credentials的HTTP请求能正常获取带Roles字段的Bearer Token,但在Azure App Service中使用DefaultAzureCredential.GetTokenAsync时,返回的令牌没有Roles字段,且oid是App Service的系统分配标识。尝试设置DefaultAzureCredentialOptions.ManagedIdentityClientId为应用注册的客户端ID时,收到400错误,提示App Service无权限使用该应用注册标识。
环境重建与测试(更新1)
重新搭建环境后,通过HTTP请求可正常获取带角色的令牌:
请求示例
POST https://login.microsoftonline.com/62765715-2081-4050-bdc7-8c2e178d7424/oauth2/v2.0/token HTTP/2.0 Content-Type: application/x-www-form-urlencoded grant_type=client_credentials &client_id=1009eb01-33c0-4bf9-ad54-726d50fb18b5 &client_secret=zlr8************************************* &scope=api:%2F%2F442b3378-34c6-421f-8912-d3f18a004d1c%2F.default
正确令牌内容
{ "aud": "api://442b3378-34c6-421f-8912-d3f18a004d1c", "iss": "https://sts.windows.net/62765715-2081-4050-bdc7-8c2e178d7424/", "iat": 1735085790, "nbf": 1735085790, "exp": 1735089690, "aio": "k2BgYDh97Ul1oVFTEfumuQ1zVuQdBQA=", "appid": "1009eb01-33c0-4bf9-ad54-726d50fb18b5", "appidacr": "1", "idp": "https://sts.windows.net/62765715-2081-4050-bdc7-8c2e178d7424/", "oid": "d5760fed-eaf1-4e6e-aed2-a2b65ac0a030", "rh": "1.AREAFVd2YoEgUEC9x4wuF410JHgzK0TGNB9CiRLT8YoATRwXAQARAA.", "roles": [ "Vehicles.Read", "Vehicles.Write" ], "sub": "d5760fed-eaf1-4e6e-aed2-a2b65ac0a030", "tid": "62765715-2081-4050-bdc7-8c2e178d7424", "uti": "4gbiMCOLlk2bJqHrffsaAA", "ver": "1.0" }
核心需求:无需客户端密钥,让App Service通过DefaultAzureCredential获取具备相同受众与角色的令牌。
尝试解决与报错(更新2)
执行以下PowerShell命令分配应用角色:
New-AzureADServiceAppRoleAssignment ` -ObjectId e67aa4a7-e487-47b9-8d27-78cf30888f61 ` -PrincipalId e67aa4a7-e487-47b9-8d27-78cf30888f61 ` -Id f39a570e-6309-496f-b81a-0de5a9e07e2e ` -ResourceId 3d73b9d4-b4b6-4741-b1f6-22a7fa6453d2
返回错误:
New-AzureADServiceAppRoleAssignment: Error occurred while executing NewServicePrincipalAppRoleAssignment Code: Request_BadRequest Message: Permission being assigned was not found on application RequestId: 8cf83ecf-c707-4621-adfe-52397837d690 DateTimeStamp: Fri, 27 Dec 2024 21:10:58 GMT Details: PropertyName - None, PropertyErrorCode - InvalidUpdate HttpStatusCode: BadRequest HttpStatusDescription: Bad Request HttpResponseStatus: Completed
后续尝试(更新3-4)
- 更新3:补充应用注册配置截图
- 更新4:将backend-api权限分配给自身后,重新执行上述命令仍报相同错误
成功解决(更新5)
使用正确的ID执行New-AzureADServiceAppRoleAssignment命令后成功。
有效代码示例
AccessToken token1 = await new DefaultAzureCredential() .GetTokenAsync(new TokenRequestContext( ["api://442b3378-34c6-421f-8912-d3f18a004d1c/"]));
返回的令牌片段(含角色)
"roles": [ "Vehicles.Read" ],
内容的提问来源于stack exchange,提问作者Ivan Koshelev
相关产品推荐
相关产品推荐

