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

Entra OpenID:客户端无法通过同一权限连接API的问题排查

问题1:你漏了最关键的配置逻辑

你现在的配置是按自定义JWT的思路写的,但Entra ID签发的JWT是用RSA非对称加密签名的,根本不需要你配置的Key字段——你的SymmetricSecurityKey完全没用,这就是返回401的核心原因。

正确的API配置应该让JwtBearer自动从Entra ID的元数据端点拉取公钥验证签名,代码改成这样:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.Authority = "https://login.microsoftonline.com/089e76d9-be81-46e6-9249-325211a2cc67/v2.0";
        options.Audience = "这里填你的API在Entra ID里的应用ID URI或者客户端ID,不是前端Blazor的ClientId!";
        
        // 中间件会自动处理签名验证,TokenValidationParameters可简化
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true
        };
    });

另外必须确保中间件顺序正确,顺序错了也会导致401:

// 先加认证,再加授权
app.UseAuthentication();
app.UseAuthorization();

额外检查点:

  • 用jwt.io解析前端给你的令牌,确认aud(受众)字段的值和你API配置的Audience完全一致,不一致肯定验证失败。
  • 确认你的API在Entra ID里已注册,并且给前端应用分配了访问API的权限(添加API权限后需授予管理员同意)。

问题2:自行生成测试令牌的方法

两种实用方式:

  1. Postman直接获取:

    • 打开Postman,选中你的请求,切换到Authorization标签,类型选OAuth 2.0
    • 配置Token URL为https://login.microsoftonline.com/089e76d9-be81-46e6-9249-325211a2cc67/oauth2/v2.0/token
    • 用客户端凭证流(适合无用户测试):填入API的Client ID和Secret,Scope填API的应用ID URI/.default
    • 点击Get New Access Token,拿到令牌后直接用在请求里即可
  2. 使用MSAL CLI工具:
    先安装工具:dotnet tool install -g Microsoft.Identity.Client.Cli
    然后运行命令获取令牌:

    # 无用户的客户端凭证流
    msal-cli get-token --client-id <API_CLIENT_ID> --client-secret <API_SECRET> --tenant-id <你的租户ID> --scopes <API_APP_ID_URI>/.default
    

推荐的完整教程资源

别找零散资料,直接看微软官方的端到端文档:

  • ASP.NET Core Web API 集成Entra ID保护:从注册应用、配置API到验证权限全流程覆盖
  • Blazor WASM 集成Entra ID登录+调用受保护API:完全匹配你的前后端场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 08:57:14