JWT簡單的許可權驗證

2021-10-24 21:58:59 字數 4083 閱讀 5597

//理解了claim, claimsidentity, claimsprincipal這三個概念,就能理解生成登入cookie為什麼要用下面的**

var claimsidentity =

newclaimsidentity

(new

claim

,"basic");

var claimsprincipal =

newclaimsprincipal

(claimsidentity)

;await context.authentication.

signinasync

(_cookieauthoptions.authenticationscheme, claimsprincipal)

;//要用cookie代表乙個通過驗證的主體,必須包含claim, claimsidentity, claimsprincipal這三個資訊;

//以乙個持有合法駕照的人做比方:

//claimsprincipal就是持有證件的人

//claimsidentity就是證件

//basic就是證件型別(這裡假設是駕照)

//claim就是駕照中的資訊。

在正式環境裡,使用者登入成功後,服務端要給客戶端返回乙個jwt字串;

所以服務端需要新增乙個生成jwt字串的方法,比如根據登入的使用者,在jwt字串裡加入使用者的id、角色(方便後面驗證介面訪問許可權)等非敏感資訊;

給控制器或方法增加訪問策略(這個就是授權,需要什麼樣的許可權才能訪問),即新增authorize特性,預設都要判斷發行人、訂閱人、金鑰3項,程式設計師還可以加入使用者名稱、使用者角色或其他規則的判斷;

客戶端獲取到jwt後,在請求頭的「authorization」加入jwt字串;

生成jwt字串的方法裡的資訊要與介面驗證所需的資訊匹配才行,比如介面要判斷角色,那jwt裡要有角色的資訊才能判斷,注:jwt攜帶的與介面所需的資訊如何比對的,是框架內部實現的,我們自己也可以增加一層判斷:新增類,繼承介面iauthorizationhandler並重寫方法handleasync(),在這個handleasync()方法,呼叫succeed()代表認證通過,但是官方認證處理同時存在,如果官方的認證失敗,最終也會認知失敗;

以上總結為:給介面設定授權規則(加authorize特性)、登入成功後發令牌(生成jwt字串)、請求攜帶令牌訪問介面、認證服務解析jwt字串、通過驗證訪問資源;

public

class

tokenmodel

public

string audience

public

string secret

public

datetime expire

}

//發放的token裡有這些,客戶端訪問時,服務端就是驗證這些

"tokenconfig"

:

//修改方法configureservices

tokenmodel tokenconfig = configuration.

getsection

("tokenconfig").

get<

tokenmodel

>()

;services.

addauthentication

("bearer").

addjwtbearer

(option =

> option.tokenvalidationparameters =

newtokenvalidationparameters()

);services.

configure

<

tokenmodel

>

(configuration.

getsection

("tokenconfig"))

;

//修改configure方法,新增中介軟體,中介軟體先後順序如下,不能修改,先userouting後認證useauthentication,再授權useauthorization

userouting()

;//先啟用認證useauthentication,後啟用授權useauthorization

useauthentication()

;//1

useauthorization()

;//2

宣告claim陣列,可以自定義鍵值對,new claim("userno", "a001"),,類似session,也可以用core定義好的new claim(claimtypes.role,"user"),還可以用jwt封裝的new claim(jwtregisteredclaimnames.acr,"abc")

例項jwtsecuritytoken物件;

jwtsecuritytoken物件轉換為字串;

public

string

gettoken()

;var key =

newsymmetricsecuritykey

(encoding.utf8.

getbytes

(tokenmodel.secret));

//2. 例項`jwtsecuritytoken`物件;

var jwtsecuritytoken =

newjwtsecuritytoken

( issuer: tokenmodel.issuer,

audience: tokenmodel.audience,

claims: myclaims,

notbefore:

null

, expires: datetime.now.

addminutes(3

),signingcredentials:

newsigningcredentials

(key, securityalgorithms.hmacsha256));

//3. 將`jwtsecuritytoken`物件轉換為字串;

//按角色判斷,客戶端token裡的role要是admin才行

//[authorize(policy:"adminanduser")] //單一角色不能滿足許可權控制,可以按策略判斷,內含多個角色的與、或關係,這種要修改sartup,**在下面

//[allowanonymous]//不受授權控制,任何人都可訪問

//[authorize]如果我們僅僅想給介面增加乙個驗證,而不要求角色資訊,就可以這麼操作。

public

iactionresult

get(

)

//按策略判斷,內含多個角色的與、或關係,這種要修改sartup

services.

addauthorization

(op =

>

);

直接訪問介面,會返回401錯誤,無許可權;

登入,成功後會得到token;

把token值放請求頭里,格式:bearer ,bearer與token之間有空格,再訪問介面,就可以了;

Python中JWT的簡單生成和驗證

json web token就是jwt的全名,用途比較廣泛的驗證資訊的方式。jwt的簡介 jwt由三部分構成,分別是頭部 header 載荷 payload 和簽名 signature 三部分由兩個.分隔。簽名 signature 是由頭部 header 和載荷 payload 經過加密演算法和秘鑰...

JWT 生成及驗證

1 composer安裝 composer require lcobucci jwt 3.3 2 例項化類 namespace tools jwt use 到你自己安裝的目錄,每個人的可能不同 use lcobucci jwt builder use lcobucci jwt parser use ...

JWT身份驗證

jwt頭 jwt頭部分是乙個描述jwt元資料的json物件,通常如下所示。有效載荷 有效載荷部分,是jwt的主體內容部分,也是乙個json物件,包含需要傳遞的資料。jwt指定七個預設字段供選擇。iss 發行人 exp 到期時間 sub 主題 aud 使用者 nbf 在此之前不可用 iat 發布時間 ...