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

使用Azure用户托管身份调用受保护Web API遇AADSTS700222错误

问题分析与解决方案

核心结论

你尝试的用户托管身份替代Client Secret的方案是可行的,但当前代码逻辑混淆了「用户身份认证流」和「应用托管身份流」,导致令牌用途冲突触发AADSTS700222错误。

错误原因

AADSTS700222错误的本质是:你通过AddMicrosoftIdentityWebApp启用的是用户登录后的身份认证流,获取的是带用户上下文的令牌;但你试图用这种用户令牌走托管身份的联邦调用逻辑,而AAD明确禁止用户令牌用于应用间的联邦身份流——两者的令牌受众、颁发场景完全不匹配。

调整方案(二选一,根据业务场景)

场景1:代表登录用户调用下游API(需要用户上下文)

此时不需要用托管身份处理用户认证,而是要确保:

  • AzureAd配置段中的ClientId是应用注册的ID,而非托管身份的ClientId
  • 下游API的权限是给应用注册配置的Delegated权限(而非给托管身份的Application权限),且已完成管理员同意
  • 保留AddMicrosoftIdentityWebApp的用户认证逻辑,确保令牌获取基于用户登录上下文

修改后的认证代码示例:

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"))
        .EnableTokenAcquisitionToCallDownstreamApi()
        .AddMicrosoftGraph(builder.Configuration.GetSection("MicrosoftGraph"))
        .AddDownstreamApi("MyDownstreamAPI", builder.Configuration.GetSection("MyDownstreamAPI"))
        .AddInMemoryTokenCaches();

场景2:应用自身身份调用下游API(无用户参与,纯服务间调用)

此时完全用托管身份替代用户登录流,不需要AddMicrosoftIdentityWebApp的用户认证逻辑,直接用托管身份获取令牌调用下游API:

// 保留Key Vault的托管身份配置(这部分是正确的)
builder.Configuration.AddAzureKeyVault(
    new Uri($"https://{builder.Configuration["KeyVaultName"]}.vault.azure.net/"),
    new DefaultAzureCredential(new DefaultAzureCredentialOptions
    {
        ManagedIdentityClientId = "68223c16-976d-....24b"
    }),
    new AzureKeyVaultConfigurationOptions()
    {
        ReloadInterval = TimeSpan.FromMinutes(1)
    });

// 配置HttpClient,用托管身份自动获取令牌
builder.Services.AddHttpClient("MyDownstreamAPI", client =>
{
    client.BaseAddress = new Uri(builder.Configuration["MyDownstreamAPI:BaseUrl"]);
}).AddHttpMessageHandler(provider =>
{
    var credential = new DefaultAzureCredential(new DefaultAzureCredentialOptions
    {
        ManagedIdentityClientId = "68223c16-976d-....24b"
    });
    var scope = builder.Configuration["MyDownstreamAPI:Scope"];
    return new Azure.Core.Pipeline.BearerTokenAuthenticationPolicy(credential, scope);
});

关键注意事项

  • 托管身份仅适用于无用户参与的服务间调用,如果业务需要用户上下文,必须使用用户登录的令牌流
  • 你之前执行的az role assignment create命令是给托管身份配置Application权限,仅在场景2下生效;场景1需要在应用注册的「API权限」中添加Delegated权限并完成管理员同意

内容的提问来源于stack exchange,提问作者Coden00b

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 21:37:40