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

使用MSAL通过Swagger授权后遇Bearer无效令牌及401/403错误求助

排查步骤

1. 修正Swagger的TokenUrl地址

你当前配置的TokenUrl路径错误,v2.0端点的正确地址应为:

TokenUrl = new Uri("https://login.microsoftonline.com/common/oauth2/v2.0/token")

原地址中的common/common是无效路径,会导致获取的token不符合API验证要求,这大概率是触发401错误的核心原因。

2. 补充Swagger安全要求配置

仅定义SecurityDefinition不足以让Swagger在请求时自动携带token,需添加SecurityRequirement强制请求携带指定权限的token:

s.AddSecurityRequirement(new OpenApiSecurityRequirement
{
    {
        new OpenApiSecurityScheme
        {
            Reference = new OpenApiReference
            {
                Type = ReferenceType.SecurityScheme,
                Id = "oauth2"
            }
        },
        new[] { "api://29867508-2243-4ae2-9e04-c740dfe793a2/access_as_user" }
    }
});

3. 验证API身份验证中间件配置

确保Program.cs中正确配置了Microsoft Identity验证,且受众与API的Client ID完全匹配:

builder.Services.AddMicrosoftIdentityWebApiAuthentication(builder.Configuration)
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddInMemoryTokenCaches();

同时检查appsettings.json中的AzureAd配置:

"AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "common",
    "ClientId": "29867508-2243-4ae2-9e04-c740dfe793a2",
    "Audience": "api://29867508-2243-4ae2-9e04-c740dfe793a2"
}

4. 检查Azure AD应用权限配置

  • API应用:确认已暴露access_as_user范围,且Manifest文件中的accessTokenAcceptedVersion字段设置为2(适配v2.0端点)。
  • 客户端应用:确保已添加API的access_as_user权限,并完成管理员同意(若为租户内用户,需管理员授权该权限后才能正常获取)。

5. 解码Token验证核心字段

用jwt.ms工具解码获取到的token,确认以下关键字段:

  • aud(受众)值为api://29867508-2243-4ae2-9e04-c740dfe793a2,确保token是发给目标API的
  • scp(权限范围)包含access_as_user,确认授权时获取到了正确的API权限
  • iss(颁发者)与API配置的租户一致,格式如https://login.microsoftonline.com/{tenantId}/v2.0

6. 切换到更安全的授权流程

Implicit Flow安全性较低,建议改为Authorization Code Flow with PKCE(Swagger作为公共客户端场景的推荐方案):

Flows = new OpenApiOAuthFlows
{
    AuthorizationCode = new OpenApiOAuthFlow()
    {
        AuthorizationUrl = new Uri("https://login.microsoftonline.com/common/oauth2/v2.0/authorize"),
        TokenUrl = new Uri("https://login.microsoftonline.com/common/oauth2/v2.0/token"),
        Scopes = new Dictionary<string, string>() { 
            { "api://29867508-2243-4ae2-9e04-c740dfe793a2/access_as_user","Access my Api stuff on my Client"}
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 17:17:33