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
相关产品推荐
相关产品推荐

