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

.NET Core应用配置授权验证Azure B2C访问令牌返回401如何解决

问题排查及解决方案

1. 中间件顺序错误(最常见诱因)

你当前Configure方法中的中间件配置缺少认证中间件,且顺序错误。认证中间件必须在授权中间件之前执行,否则请求不会自动解析携带的JWT令牌,会直接返回401。
修正后的中间件顺序:

public void Configure(IApplicationBuilder appBuilder)
{
    // ...其他前置中间件(如异常处理、静态文件等)
    appBuilder.UseRouting();
    // 先添加认证中间件解析令牌
    appBuilder.UseAuthentication();
    // 再执行授权校验逻辑
    appBuilder.UseAuthorization();
    // ...端点映射等后续中间件
}

2. 手动拉取OpenID配置的潜在问题

你在AddJwtBearer配置中直接用.Result同步调用异步方法拉取配置,启动阶段容易出现线程死锁、网络请求失败等问题,而且后续签名密钥过期后无法自动刷新。
不需要手动拉取配置,直接使用JWT Bearer原生提供的元数据配置即可,框架会自动拉取、刷新issuer和签名密钥,修正后的服务注册代码:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(cfg =>
    {
        // 直接填入B2C的元数据地址即可,无需自行拉取配置
        cfg.MetadataAddress = "https://<tenant>.b2clogin.com/<tenant>.onmicrosoft.com/<policyId>/v2.0/.well-known/openid-configuration";
        cfg.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateAudience = true,
            ValidAudience = "<ClientId>",
            ValidateIssuer = true,
            ValidateIssuerSigningKey = true,
            ValidateLifetime = true
        };
    });

3. 其他校验错误排查点

  • 确认请求头中携带的令牌格式正确,格式为Bearer <accessToken>,注意Bearer和令牌之间的空格不能省略
  • 确认你配置的<policyId>和实际签发令牌时使用的B2C用户流/自定义策略完全一致,不同策略的issuer值不同,会导致签发方校验失败
  • 确认<ClientId>填写的是你在B2C中注册的当前API的客户端ID,不是前端客户端的ID
  • 如果你的令牌是v1版本,可以临时关闭ValidateAudience测试,确认是否是受众配置错误导致的401

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 17:15:02