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

Azure B2C与.NET Core 3.1 API配置问题:调用返回401未授权

解决.NET Core 3.1 Web API Azure AD B2C 401未授权问题

我之前在移植Azure AD B2C配置到.NET Core API时也踩过一模一样的坑,结合你给出的代码和错误信息,核心是几个关键配置细节没处理到位,咱们一步步来修复:

1. 修复中间件顺序(最关键的问题)

你的Configure方法里漏掉了认证中间件!.UseAuthentication()必须放在.UseAuthorization()之前,不然授权逻辑执行时还没完成身份认证,直接就会返回401。修改后的Configure方法应该是这样:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseRouting();

    // 必须加这一行,放在UseAuthorization之前
    app.UseAuthentication();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

2. 修正Azure AD B2C Authority格式

你当前的Authority带了.well-known/openid-configuration/后缀,但.NET的JWT Bearer中间件不需要这个,它会自动根据基础Authority地址去获取元数据。另外,Azure AD B2C的标准Authority格式需要包含tfp(Tenant-First Party)路径段,修改你的appsettings.json:

"AzureAdB2C": {
  "Audience": "c6exxx-xxxxxxxx",
  "Authority": "https://XXX.b2clogin.com/tfp/XX.onmicrosoft.com/B2C_SUSI_POLICY/v2.0/"
}

3. 补充JWT令牌验证的额外配置(可选但推荐)

有时候B2C的令牌 issuer格式会导致默认验证失败,你可以在AddJwtBearer里添加TokenValidationParameters来调整验证逻辑,确保令牌的issuer符合B2C的格式:

.AddJwtBearer(options =>
{
    options.Authority = Configuration["AzureAdB2C:Authority"];
    options.Audience = Configuration["AzureAdB2C:Audience"];
    
    // 补充验证参数
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        // 针对B2C的issuer格式,允许租户ID或域名形式的issuer
        ValidIssuers = new[]
        {
            $"https://XXX.b2clogin.com/XX.onmicrosoft.com/v2.0/",
            $"https://XXX.b2clogin.com/{你的租户ID}/v2.0/"
        },
        // 如果不确定租户ID,也可以自定义issuer验证逻辑
        // IssuerValidator = (issuer, token, parameters) =>
        // {
        //     if (issuer.StartsWith("https://XXX.b2clogin.com/"))
        //         return issuer;
        //     throw new SecurityTokenInvalidIssuerException("Invalid issuer");
        // }
    };
});

4. 确认控制器/方法已添加授权特性

确保你需要保护的API控制器或方法上添加了[Authorize]特性,比如:

[ApiController]
[Route("[controller]")]
[Authorize] // 必须加这个才能触发授权检查
public class HelloController : ControllerBase
{
    [HttpGet("hello")]
    public IActionResult GetHello()
    {
        return Ok("Hello from protected API");
    }
}

做完这些修改后,重启你的.NET Core API,然后用前端携带正确的Azure AD B2C令牌调用接口,应该就能正常通过授权了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 19:37:40