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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 18:45:00