ASP.NET Core网关中用AddJwtBearer实现无需控制器[Authorize]的JWT认证
解决方案
方案核心思路
利用YARP原生支持的路由级授权元数据绑定能力,直接在网关层给反向代理路由绑定认证/授权策略,完全不需要修改下游业务项目代码,也无需给控制器加[Authorize]特性。
具体实现步骤
1. 网关层配置JWT认证与授权策略
在Project.Gateway的ConfigureServices方法中完成认证、授权逻辑配置,和常规JWT配置逻辑一致:
using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.IdentityModel.Tokens; using System.Text; public void ConfigureServices(IServiceCollection services) { // 配置JWT认证 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = "你的JWT颁发者", ValidAudience = "你的JWT接收方", IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("你的JWT签名密钥")) }; }); // 配置授权策略,支持自定义多套策略 services.AddAuthorization(options => { // 全局默认认证策略:要求请求携带有效JWT options.DefaultPolicy = new AuthorizationPolicyBuilder(JwtBearerDefaults.AuthenticationScheme) .RequireAuthenticatedUser() .Build(); // 可额外添加自定义策略,比如要求特定角色 options.AddPolicy("AdminOnly", policy => policy.RequireRole("admin").RequireClaim("Permission")); }); // 配置YARP反向代理 services.AddReverseProxy() .LoadFromConfig(Configuration.GetSection("YARP")); }
2. 给YARP路由绑定授权策略
有两种配置方式可选,不需要修改下游项目任何代码:
方式一:通过appsettings.json配置(推荐)
在YARP的路由配置节点下增加Metadata节点,指定要绑定的授权策略即可:
{ "YARP": { "Routes": { "XXXApiRoute": { "ClusterId": "XXXCluster", "Match": { "Path": "api/xxx/{**catch-all}" }, "Metadata": { // 绑定默认认证策略,请求该路由时自动触发JWT校验 "AuthorizationPolicy": "DefaultPolicy" // 如果要绑定自定义策略就写策略名,比如 "AuthorizationPolicy": "AdminOnly" } }, // 公开接口(如登录)可单独配置允许匿名访问 "AuthRoute": { "ClusterId": "AuthCluster", "Match": { "Path": "api/auth/{**catch-all}" }, "Metadata": { "AllowAnonymous": "true" } } }, "Clusters": { // 你的集群配置 } } }
方式二:通过代码配置路由
如果是用代码动态注册YARP路由,直接调用RequireAuthorization方法绑定策略即可:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 中间件顺序不要错:先认证、再授权、最后反向代理 app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapReverseProxy(); // 或手动指定路由策略 // endpoints.MapReverseProxy() // .MapRoute("XXXApiRoute", "api/xxx/{**catch-all}") // .RequireAuthorization() // 绑定默认策略 // .RequireAuthorization("AdminOnly"); // 绑定自定义策略 }); }
方案说明
- 该方案完全符合要求:无自定义中间件,所有JWT校验逻辑都在网关的
ConfigureServices中配置,下游业务项目不需要做任何适配,不需要添加认证相关依赖或[Authorize]特性。 - 支持自定义任意授权策略:你可以在
AddAuthorization中配置任意基于角色、Claim、自定义规则的策略,直接绑定到对应YARP路由即可,完全不依赖下游控制器的特性标注。
内容的提问来源于stack exchange,提问作者R.Duteil
相关产品推荐
相关产品推荐

