ASP.NET Core调用AddBearerToken仍报Bearer认证处理程序未注册
问题原因与修复方案
问题根源
你注册Bearer Token认证时使用的IdentityConstants.BearerScheme,其实际值为**Identity.Bearer**,但你在[Authorize]特性中指定的是"Bearer"——两者名称不匹配,导致框架找不到对应的认证处理器,从而抛出错误。
修复步骤
1. 统一Scheme名称(二选一即可)
方案一:遵循Identity默认规范
在[Authorize]特性中使用正确的Scheme常量:[Authorize(AuthenticationSchemes = IdentityConstants.BearerScheme)] [HttpGet("products")] public IActionResult GetAllProducts() { // 接口逻辑 return Ok(); }方案二:显式指定Scheme为"Bearer"
注册认证时替换IdentityConstants.BearerScheme为字符串"Bearer":builder.Services.AddIdentity<IdentityUser, IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddBearerToken("Bearer"); builder.Services.AddAuthentication(options => { options.DefaultAuthenticateScheme = "Bearer"; options.DefaultChallengeScheme = "Bearer"; }) .AddBearerToken("Bearer");此时控制器可继续使用
[Authorize(AuthenticationSchemes = "Bearer")]。
2. 完整Program.cs配置示例(推荐方案一)
var builder = WebApplication.CreateBuilder(args); // 配置数据库上下文 builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); // 添加Identity并启用Bearer Token builder.Services.AddIdentity<IdentityUser, IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddBearerToken(IdentityConstants.BearerScheme); // 配置认证,可选设置默认Scheme避免重复指定 builder.Services.AddAuthentication(options => { options.DefaultAuthenticateScheme = IdentityConstants.BearerScheme; options.DefaultChallengeScheme = IdentityConstants.BearerScheme; }) .AddBearerToken(IdentityConstants.BearerScheme); var app = builder.Build(); // 中间件顺序必须正确:先认证,再授权 app.UseAuthentication(); app.UseAuthorization(); // 配置端点 app.MapControllers(); app.Run();
3. 简化控制器标注(设置默认Scheme后)
如果在认证配置中设置了DefaultAuthenticateScheme,控制器无需指定AuthenticationSchemes,直接用[Authorize]即可:
[Authorize] [HttpGet("products")] public IActionResult GetAllProducts() { // 接口逻辑 return Ok(); }
额外检查
确保UseAuthentication()中间件在UseAuthorization()之前执行,否则认证逻辑不会生效,未授权接口也无法返回401状态码。
内容的提问来源于stack exchange,提问作者user28273827332
相关产品推荐
相关产品推荐

