任務38:JWT 設計解析及定製html
改造jwt tokengit
token的值不放在Authorize裏面,而是放在header的token裏面github
asp.net core的源代碼數組
在Security的下面asp.net
https://github.com/aspnet/AspNetCore/tree/master/src/Securityide
這是jwtBearer的認證的源碼:spa
https://github.com/aspnet/AspNetCore/tree/master/src/Security/Authentication/JwtBearer/src.net
AddJwtBearer的擴展方法在這裏。設計
就是咱們的StartUp裏面的方法調用的AddJwtBearer
JwtBearerHandler.cs
這裏提供咱們一種方式Token能夠從別的地方去拿,而不是從Header的Authorize的裏面去拿token:
1分55秒
拿到token之後,下面會進行一些驗證。咱們要看關鍵是如何去加在本身的認證。
咱們就是要加一個本身的Validate,在循環裏面完成本身的業務邏輯。
也就是咱們須要把token讀取的地方給換掉。同時把token驗證的邏輯換掉。
2分57秒
咱們看到這裏new了一個MessageReceivedContext 實際上它是包裝,把咱們當前的HttpContext和Scheme覺得Options配置全都放進來
而後下面調用了 MessageReceived的這種方式
咱們的MessageReceivedContext 在這個地方:
而後是:JwtBearerEvents
咱們能夠把這個地方給改掉:
同時最下面還有TokenValidated方法,咱們用來手動寫一下
開始改寫咱們以前寫的代碼:3分27秒
咱們先把原來的代碼註釋掉
//SecurityTokenValidators這是一個數組,咱們先把它清空掉,不然它會從裏面拿驗證 o.SecurityTokenValidators.Clear(); //new一個event,咱們要對它進行改造 o.Events = new JwtBearerEvents() { OnMessageReceived = context =>{ var token = context.Request.Headers["mytoken"];//獲取header中的token context.Token = token.FirstOrDefault();//賦值給Context中的Token return Task.CompletedTask; } };
而後再加Validator驗證
根目錄下建立類:MyTokenValidator.cs
繼承:ISecurityTokenValidator在這個命名空間下using Microsoft.IdentityModel.Tokens;
修改接口的方法的返回值。
完成認證,以及給indetity賦值的過程
上面判斷了token的值若是不對就返回了null是不能夠的。必需要返回一個principal對象,哪怕是一個空的
再次修改以下:
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Authentication.JwtBearer; using System.Security.Claims; using Microsoft.IdentityModel.Tokens; namespace JwtAuthSample { public class MyTokenValidator : ISecurityTokenValidator { public bool CanValidateToken => true; public int MaximumTokenSizeInBytes { get; set; } public bool CanReadToken(string securityToken) { return true; } public ClaimsPrincipal ValidateToken(string securityToken, TokenValidationParameters validationParameters, out SecurityToken validatedToken) { //進行驗證 validatedToken = null;//要先進行賦值 var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme); if (securityToken == "abcdefg") { identity.AddClaim(new Claim("name", "wjw")); identity.AddClaim(new Claim("SuperAdminOnly", "true")); identity.AddClaim(new Claim(ClaimsIdentity.DefaultRoleClaimType, "user")); } var principal = new ClaimsPrincipal(identity); ; return principal;//不能直接返回null這裏必須返回一個pincipal對象 } } }
而後在startup中丟過去這段驗證
這樣就完成了定製的過程,咱們修改了token的來源,同時咱們該了token的驗證方式
加了個;
[Authorize(Policy ="SuperAdminOnly")]
因此在驗證的時候,咱們也必需要給claim的一個SuperAdminOnly的Claim
本機代碼報錯:
System.InvalidOperationException:「The AuthorizationPolicy named: 'SuperAdminOnly' was not found.」
policy策略的相關文章:
http://www.javashuo.com/article/p-tzixxrnh-e.html
博客園遇到的錯誤的地址:https://q.cnblogs.com/q/92774/
https://docs.microsoft.com/zh-cn/aspnet/core/security/authorization/policies?view=aspnetcore-2.2
*****************************************************************************
參考視頻的代碼寫法 ,就是運行不起來。
如下是視頻中的截圖:
輸入一個錯誤的token
輸入一個正確的mytoken的值。而後就會返回 200.而且輸出 claim的值
這是視頻中的項目,和原來的JwtAuthSample不是一個項目。