Asp.Net Core 2 JwtBearer认证:默认授权与返回401而非跳转登录
针对你在ASP.NET Core 2中使用JWT Bearer认证碰到的两个问题,我给你整理了适配纯JWT认证场景的具体解决方案:
问题1:设置全局默认授权,仅允许带
[AllowAnonymous]的接口匿名访问 要实现所有接口默认需要授权、仅标记[AllowAnonymous]的控制器/操作可匿名访问,你需要在Startup.cs中完成以下配置:
- 先确保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("你的密钥")) }; });
- 注册授权服务并设置默认授权策略,强制要求所有接口必须经过认证:
services.AddAuthorization(options => { options.DefaultPolicy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build(); });
- 最后在
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
相关产品推荐
相关产品推荐

