zoukankan      html  css  js  c++  java
  • Ocelot.JwtAuthorize:一个基于网关的Jwt验证包

    Ocelot作为基于.net core的API方关,有一个功能是统一验证,它的作用是把没有访问权限的请求挡在API网关外面,而不是到达API网关事端的API时才去验证;之前我有一篇博文https://www.cnblogs.com/axzxs2001/p/8005084.html,作过说明,这篇博文说明了实现代码,今天我把这个实现作了整理,封装成一个Nuget包,供大家方便调用。

    Web API的验证一般是用UserName和Password请求到Token,然后每次请求需要权限的API接口是把Token带到请求的Header中,作为凭据,API服端接收到请求后就要对客户端带的Token作验证,查看Token是否正确,是否过期,如果没有问题,再对该用户作权鉴,该用户是否有权限访问本API接口;这样看来,登录获取Tokent算一块,成功登录后,每次带Token请求又分两块:一块是验证,一块是鉴权,所以在Ocelot.JwtAuthorize中一共分三块。

    项目的源码位于https://github.com/axzxs2001/Ocelot.JWTAuthorize

    Nuget是https://www.nuget.org/packages/Ocelot.JwtAuthorize

    使用也非常简单,首先有统一的配置文件(网关项目中,API项目中,验证项目中)

    1 "JwtAuthorize": {
    2   "Secret": "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890",
    3   "Issuer": "gsw",
    4   "Audience": "everyone",
    5   "PolicyName": "permission",
    6   "DefaultScheme": "Bearer",
    7   "IsHttps": false,
    8   "Expiration": 50000
    9 }
    View Code

    1、网关项目中在Startup的ConfigureService方法中注入services.AddOcelotJwtAuthorize()即可。

    2、验证项目中在Startup的ConfigureService方法中注入services.AddTokenJwtAuthorize(),同时验证项目还有一个作用是分发Token,前提是用户有正确的用户名密码,所以要做一个登录的Colloer和Action来实现,注意登录时Claim中的信息是在API项目中验证权限的信息。

     1 readonly ILogger<LoginController> _logger;
     2 //ITokenBuilder是用来生成Token的
     3 readonly ITokenBuilder _tokenBuilder;
     4 public LoginController(ITokenBuilder tokenBuilder, ILogger<LoginController> logger)
     5        {
     6            _logger = logger;
     7            _tokenBuilder = tokenBuilder;
     8  
     9        }
    10        [HttpPost]
    11        public IActionResult Login([FromBody]LoginModel loginModel)
    12        {
    13            _logger.LogInformation($"{loginModel.UserName} login!");
    14            if (loginModel.UserName == "gsw" && loginModel.Password == "111111")
    15            {
    16                var claims = new Claim[] {
    17                    new Claim(ClaimTypes.Name, "gsw"),
    18                    new Claim(ClaimTypes.Role, "admin"),
    19                  
    20                };               
    21                var token = _tokenBuilder.BuildJwtToken(claims);
    22                _logger.LogInformation($"{loginModel.UserName} login success,and generate token return");
    23                return new JsonResult(new { Result = true, Data = token });
    24            }
    25            else
    26            {
    27                _logger.LogInformation($"{loginModel.UserName} login faile");
    28                return new JsonResult(new
    29                {
    30                    Result = false,
    31                    Message = "Authentication Failure"
    32                });
    33            }
    34        }
    View Code

    3API项目中在StartupConfigureService方法中注入,并且在Controller或Action上加配置文件中的ProlicyName的配置名称,本例是permission

    1 services.AddApiJwtAuthorize((context) =>
    2 {
    3     //这里根据context中的Request和User来自定义权限验证,返回true为放行,返回fase时为拦截,其中User.Claims中有登录时自己定义的Claim
    4     return true;
    5 })
    View Code
    1     [Authorize("permission")]
    2     [Route("api/[controller]")]
    3     [ApiController]
    4     public class ValuesController : Controller
    5     {
    6         //……
    7     }
    View Code

    具体体安例参照https://github.com/axzxs2001/Ocelot.JWTAuthorize下的Sample

    
    
  • 相关阅读:
    通过日志过滤的方法,统计每天内容详情页面的PV数
    模拟开户接口,使用python脚本实现批量用户开通
    模拟开户接口,使用shell脚本实现批量用户开通
    TCP的socket资源被耗尽的问题
    excel文件使用navicat工具导入mysql的方法
    MYSQL主从同步/主主同步
    django在创建用户时设置一个默认的密码
    django 字段默认值
    django中写入数据时给密码加密
    django后台admin页面表单自定义
  • 原文地址:https://www.cnblogs.com/axzxs2001/p/9250588.html
Copyright © 2011-2022 走看看