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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:39:51