跳至主要內容

3.7 JWT授权

linguicheng...大约 1 分钟

简介

网关支持JWT授权是为了让系统功能权限控制放在网关统一处理,这样下游服务可以不用管权限认证和授权。

创建一个支持JWT授权的网关

安装依赖包

dotnet add package Wing.Consul

dotnet add package Wing.Gateway

Program代码

using System.Security.Claims;
using Wing;

var builder = WebApplication.CreateBuilder(args);

builder.Host.AddWing(builder => builder.AddConsul());

builder.Services.AddAuthorization();
builder.Services.AddAuthentication("Bearer").AddJwtBearer();
builder.Services.AddWing()
                .AddGateWay((downstreams, context) =>
                {
                    //此处添加业务授权逻辑,也可以将payload解析的内容通过请求头转发到下游服务context.Request.Headers.Append()
                    var account = context.User.Claims.Where(c => c.Type == ClaimTypes.NameIdentifier).FirstOrDefault().Value;
                    context.Request.Headers.Append("user-account", account);
                    return Task.FromResult(true);
                }); 

var app = builder.Build();

app.Run();

配置示例

{
  "Gateway": {
    // 自定义路由
    "Routes": [
      {
        // 上游配置
        "Upstream": {
          // 请求Url
          "Url": "jwt",
          // 请求方式
          "Method": "get"
        },
        // 下游配置
        "Downstreams": [
          {
            // 服务名称
            "ServiceName": "Wing.Demo_3.2",
            "Url": "WeatherForecast/JwtAuthPolicy",
            // 请求方式
            "Method": "get"
          }
        ],
        // 是否启用JWT认证
        "UseJWTAuth": true,
        // 固定Key认证
        "AuthKey": ""
      }
    ],
    // 请求日志
    "Log": {
      "IsEnabled": false,
      "UseEventBus": false
    }
  }
}

获取token

执行创建JWT token的dotnet命令,结果如下:

dotnet user-jwts create

查看运行结果

分别启动API服务示例3.2(点击查看完整示例代码3.2open in new window)、网关示例3.7(点击查看完整示例代码3.7open in new window),访问http://localhost:3710/jwtopen in new window ,返回结果如下图:

上次编辑于:
贡献者: linguicheng