任務38:JWT 設計解析及定製

任務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

 

 github源代碼的講解

 這是jwtBearer的認證的源碼:spa

https://github.com/aspnet/AspNetCore/tree/master/src/Security/Authentication/JwtBearer/src.net

 AddJwtBearer的擴展方法在這裏。設計

 https://github.com/aspnet/AspNetCore/blob/master/src/Security/Authentication/JwtBearer/src/JwtBearerExtensions.cs3d

 

 

 就是咱們的StartUp裏面的方法調用的AddJwtBearer

 

JwtBearerHandler.cs

https://github.com/aspnet/AspNetCore/blob/master/src/Security/Authentication/JwtBearer/src/JwtBearerHandler.cs

這裏提供咱們一種方式Token能夠從別的地方去拿,而不是從Header的Authorize的裏面去拿token:

 

1分55秒

 

拿到token之後,下面會進行一些驗證。咱們要看關鍵是如何去加在本身的認證。

咱們就是要加一個本身的Validate,在循環裏面完成本身的業務邏輯。

也就是咱們須要把token讀取的地方給換掉。同時把token驗證的邏輯換掉。

 

 

 

2分57秒

咱們看到這裏new了一個MessageReceivedContext 實際上它是包裝,把咱們當前的HttpContext和Scheme覺得Options配置全都放進來

而後下面調用了 MessageReceived的這種方式

 

 

咱們的MessageReceivedContext 在這個地方:

https://github.com/aspnet/AspNetCore/blob/master/src/Security/Authentication/JwtBearer/src/MessageReceivedContext.cs

而後是:JwtBearerEvents

https://github.com/aspnet/AspNetCore/blob/master/src/Security/Authentication/JwtBearer/src/JwtBearerEvents.cs

 

咱們能夠把這個地方給改掉:

 

同時最下面還有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對象

        }
    }
}
MyTokenValidator

 

 

而後在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不是一個項目。

相關文章
相關標籤/搜索