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項目中,驗證項目中)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLrN2bsJEZlR3YhJHdu92Qvw1cy9GdhNWak5WSn5WaulGb0V3TvwVbvNmLzd2bsJmbj5ycldWYtl2Lc9CX6MHc0RHaiojIsJye.gif)
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項目中驗證權限的資訊。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLrN2bsJEZlR3YhJHdu92Qvw1cy9GdhNWak5WSn5WaulGb0V3TvwVbvNmLzd2bsJmbj5ycldWYtl2Lc9CX6MHc0RHaiojIsJye.gif)
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
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLrN2bsJEZlR3YhJHdu92Qvw1cy9GdhNWak5WSn5WaulGb0V3TvwVbvNmLzd2bsJmbj5ycldWYtl2Lc9CX6MHc0RHaiojIsJye.gif)
1 services.AddApiJwtAuthorize((context) =>
2 {
3 //這裡根據context中的Request和User來自定義權限驗證,傳回true為放行,傳回fase時為攔截,其中User.Claims中有登入時自己定義的Claim
4 return true;
5 })
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLrN2bsJEZlR3YhJHdu92Qvw1cy9GdhNWak5WSn5WaulGb0V3TvwVbvNmLzd2bsJmbj5ycldWYtl2Lc9CX6MHc0RHaiojIsJye.gif)
1 [Authorize("permission")]
2 [Route("api/[controller]")]
3 [ApiController]
4 public class ValuesController : Controller
5 {
6 //……
7 }
具體體安例參照https://github.com/axzxs2001/Ocelot.JWTAuthorize下的Sample。
****歡迎關注我的asp.net core系統課程****《asp.net core精要講解》 https://ke.qq.com/course/265696
《asp.net core 3.0》 https://ke.qq.com/course/437517
《asp.net core項目實戰》 https://ke.qq.com/course/291868
《基于.net core微服務》 https://ke.qq.com/course/299524