Ocelot做为基于.net core的API方关,有一个功能是统一验证,它的做用是把没有访问权限的请求挡在API网关外面,而不是到达API网关事端的API时才去验证;以前我有一篇博文http://www.javashuo.com/article/p-voqnbscw-mc.html,做过说明,这篇博文说明了实现代码,今天我把这个实现做了整理,封装成一个Nuget包,供你们方便调用。html
Web API的验证通常是用UserName和Password请求到Token,而后每次请求须要权限的API接口是把Token带到请求的Header中,做为凭据,API服端接收到请求后就要对客户端带的Token做验证,查看Token是否正确,是否过时,若是没有问题,再对该用户做权鉴,该用户是否有权限访问本API接口;这样看来,登陆获取Tokent算一块,成功登陆后,每次带Token请求又分两块:一块是验证,一块是鉴权,因此在Ocelot.JwtAuthorize中一共分三块。git
项目的源码位于https://github.com/axzxs2001/Ocelot.JWTAuthorizegithub
Nuget是https://www.nuget.org/packages/Ocelot.JwtAuthorizeapi
使用也很是简单,首先有统一的配置文件(网关项目中,API项目中,验证项目中)ide
1 "JwtAuthorize": { 2 "Secret": "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", 3 "Issuer": "gsw", 4 "Audience": "everyone", 5 "PolicyName": "permission", 6 "DefaultScheme": "Bearer", 7 "IsHttps": false, 8 "Expiration": 50000 9 }
一、网关项目中在Startup的ConfigureService方法中注入services.AddOcelotJwtAuthorize()便可。ui
二、验证项目中在Startup的ConfigureService方法中注入services.AddTokenJwtAuthorize(),同时验证项目还有一个做用是分发Token,前提是用户有正确的用户名密码,因此要作一个登陆的Colloer和Action来实现,注意登陆时Claim中的信息是在API项目中验证权限的信息。
spa
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 }
3、API项目中在Startup的ConfigureService方法中注入,而且在Controller或Action上加配置文件中的ProlicyName的配置名称,本例是permission.net
1 services.AddApiJwtAuthorize((context) => 2 { 3 //这里根据context中的Request和User来自定义权限验证,返回true为放行,返回fase时为拦截,其中User.Claims中有登陆时本身定义的Claim 4 return true; 5 })
1 [Authorize("permission")] 2 [Route("api/[controller]")] 3 [ApiController] 4 public class ValuesController : Controller 5 { 6 //…… 7 }
具体体安例参照https://github.com/axzxs2001/Ocelot.JWTAuthorize下的Sample。code