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