You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 07:49:52