如何在.Net Core的Swashbuckle中正确配置JWT Token身份验证
你配置中的问题主要出在中间件顺序和授权策略匹配两个方面,按以下步骤调整即可:
问题1:认证授权中间件顺序颠倒
ASP.NET Core 中间件按注册顺序执行,必须先运行身份认证中间件解析JWT得到用户身份,再运行授权中间件校验权限。你当前的顺序是先调用UseAuthorization再调用UseAuthentication,请求还没完成身份识别就被授权校验拦截,直接返回401。
问题2:CORS中间件位置错误
CORS中间件需要放在路由匹配之后、认证授权中间件之前,否则跨域预检请求会被认证逻辑拦截,也会导致请求失败。你当前把CORS配置放在了端点映射之后,完全没有生效。
问题3:授权策略不匹配
你自定义了名为Bearer的授权策略,但Action上的[Authorize]特性没有指定使用该策略,如果你没有设置全局默认授权策略,授权校验不会走你配置的JWT认证逻辑,也会触发401。
修复步骤
- 调整
Configure方法的中间件顺序,修改后代码如下:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseHttpsRedirection(); app.UseRouting(); // CORS放在路由之后、认证之前 app.UseCors(x => x .AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader()); // 先认证,再授权,顺序不能反 app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { _ = endpoints.MapControllers(); }); app.UseStatusCodePages(); app.UseSwagger(); app.UseSwaggerUI(c => { c.DefaultModelExpandDepth(0); c.DefaultModelsExpandDepth(-1); c.SwaggerEndpoint("/swagger/v1/swagger.json", "V1 API test"); c.RoutePrefix = string.Empty; }); }
- 修复授权策略匹配,二选一即可:
- 方案A:设置全局默认授权策略,修改
ConfigureServices中的授权配置:
services.AddAuthorization(auth => { auth.DefaultPolicy = new AuthorizationPolicyBuilder() .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme) .RequireAuthenticatedUser().Build(); });
- 方案B:修改Action的授权特性,指定使用的策略或认证方案:
[HttpPost] [Route("DestroyUserSession")] // 二选一即可:指定策略 或者 直接指定JWT认证方案 [Authorize(Policy = "Bearer")] // [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] public async Task<ResultModel> DestroyUserSession([FromBody] string userID) { //..... 业务逻辑 }
- 额外检查点
- 你当前的Swagger安全配置是正确的,在Swagger UI点Authorize按钮输入Token时,不要手动加
Bearer前缀,Swagger会自动补充,重复添加会导致认证失败。 - 确认
appsettings.json中的JwtSettings配置项(Issuer、Audience、密钥等)和你生成JWT Token时使用的参数完全一致,否则JWT校验不通过也会返回401。
内容的提问来源于stack exchange,提问作者Levesque Xylia
相关产品推荐
相关产品推荐

