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

Asp.Net Core 2 JwtBearer认证:默认授权与返回401而非跳转登录

针对你在ASP.NET Core 2中使用JWT Bearer认证碰到的两个问题,我给你整理了适配纯JWT认证场景的具体解决方案:

问题1:设置全局默认授权,仅允许带[AllowAnonymous]的接口匿名访问

要实现所有接口默认需要授权、仅标记[AllowAnonymous]的控制器/操作可匿名访问,你需要在Startup.cs中完成以下配置:

  1. 先确保JWT Bearer认证的基础配置已经完成:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = "你的颁发者地址",
            ValidAudience = "你的受众标识",
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("你的密钥"))
        };
    });
  1. 注册授权服务并设置默认授权策略,强制要求所有接口必须经过认证:
services.AddAuthorization(options =>
{
    options.DefaultPolicy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();
});
  1. 最后在Configure方法中保证中间件顺序正确(认证在前,授权在后):
app.UseAuthentication();
app.UseAuthorization();

完成后,除了你标记了[AllowAnonymous]的令牌颁发接口,其他所有接口都会自动要求授权访问。

问题2:让接口返回401状态码而非重定向到登录页

在纯JWT认证场景下,默认应该返回401,但如果出现重定向,大概率是默认的挑战逻辑被触发。你可以通过配置JWT Bearer的事件处理器来强制返回401响应:

在AddJwtBearer的配置中添加OnChallenge事件处理:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        // 保留之前的TokenValidationParameters配置...

        options.Events = new JwtBearerEvents
        {
            OnChallenge = context =>
            {
                // 跳过默认的重定向逻辑
                context.HandleResponse();
                
                // 返回自定义的401 JSON响应
                context.Response.StatusCode = StatusCodes.Status401Unauthorized;
                context.Response.ContentType = "application/json";
                
                var errorResponse = JsonConvert.SerializeObject(new 
                { 
                    Message = "未授权访问,请提供有效的JWT令牌",
                    StatusCode = 401
                });
                return context.Response.WriteAsync(errorResponse);
            }
        };
    });

另外要注意:如果你之前不小心启用了Cookie认证相关的中间件(比如app.UseCookieAuthentication()),请移除它,因为Cookie认证的默认逻辑会触发重定向,而你是纯JWT认证,只需要保留JwtBearer的配置即可。

内容的提问来源于stack exchange,提问作者Mathias Rönnlund

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:24:16