天天看點

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項目中,驗證項目中)

Ocelot.JwtAuthorize:一個基于網關的Jwt驗證包
Ocelot.JwtAuthorize:一個基于網關的Jwt驗證包

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項目中驗證權限的資訊。

Ocelot.JwtAuthorize:一個基于網關的Jwt驗證包
Ocelot.JwtAuthorize:一個基于網關的Jwt驗證包
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

Ocelot.JwtAuthorize:一個基于網關的Jwt驗證包
Ocelot.JwtAuthorize:一個基于網關的Jwt驗證包
1 services.AddApiJwtAuthorize((context) =>
2 {
3     //這裡根據context中的Request和User來自定義權限驗證,傳回true為放行,傳回fase時為攔截,其中User.Claims中有登入時自己定義的Claim
4     return true;
5 })      
Ocelot.JwtAuthorize:一個基于網關的Jwt驗證包
Ocelot.JwtAuthorize:一個基于網關的Jwt驗證包
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

繼續閱讀