继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Ocelot.JwtAuthorize:一个基于网关的Jwt验证包

狐的传说
关注TA
已关注
手记 297
粉丝 88
获赞 555

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

3、API项目中在Startup的ConfigureService方法中注入

1 services.AddApiJwtAuthorize((context) => 2 { 3     //这里根据context中的Request和User来自定义权限验证,返回true为放行,返回fase时为拦截,其中User.Claims中有登录时自己定义的Claim 4     return true; 5 })

View Code

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

原文出处

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP