C 實現JWT無狀態驗證的實戰應用

2022-05-23 08:57:13 字數 3990 閱讀 7598

前言

本文主要介紹jwt的實戰運用。

準備工作

首先我們建立乙個asp.net的,包含mvc和webapi的web專案。

然後使用nuget搜尋jwt,安裝jwt類庫,如下圖。

設計思路

這裡我們簡單的做了乙個token驗證的設計,設計思路如下圖所示:

**實現

快取首先,我們先開發工具類,根據設計思路圖可得知,我們需要乙個快取類,用於在伺服器端儲存token。

public class cachehelper ​

public static t getcache(string key) where t : class

​ public static bool containskey(string key)

​ public static void removecache(string key)

​ public static void setkeyexpire(string key, timespan expire)

​ public static void setcache(string key, object value)

​ public static void setcache(string key, object value, timespan timeout)

​ public static void setcache(string key, object value, timespan timeout, expiretype expiretype)

​ private static void _setcache(string key, object value, timespan? timeout, expiretype? expiretype)

else}}

} /// /// 過期型別

///

public enum expiretype

如上述**所示,我們編寫了快取幫助類—cachehelper類。

cachehelper類:使用httpruntime的快取,類裡實現快取的增刪改,因為使用的是httpruntime,所以,如果沒有設定快取的超時時間,則快取的超時時間等於httpruntime.cache配置的預設超時時間。

如果**掛載在iis裡,那麼,httpruntime.cache配置超時時間的地方在該**的應用程式池中,如下圖:

jwt的幫助類

現在我們編寫jwt的幫助類,**如下:

public class jwthelper

, ,

};​ ijwtalgorithm algorithm = new hmacsha256algorithm();

ijsonserializer serializer = new jsonnetserializer();

ibase64urlencoder urlencoder = new jwtbase64urlencoder();

ijwtencoder encoder = new jwtencoder(algorithm, serializer, urlencoder);

​ var token = encoder.encode(payload, secret);

return token;

}/// /// 根據jwttoken 獲取實體

///

/// jwttoken

///

public static idictionarygetjwtdecode(string token)

}

**很簡單,實現了jwt的code的建立和解析。

注:jwt的code雖然是密文,但它是可以被解析的,所以我們不要在code裡儲存重要資訊,比如密碼。

jwt的code與解析後的內容如下圖所示,左邊未code,右邊未解析的內容。

authenticationhelper驗證幫助類

現在,我們已經可以編寫驗證類了,利用剛剛已建立的快取幫助類和jwt幫助類。

authenticationhelper驗證幫助類**如下:

public class authenticationhelper

public static void adduserauth(string username, timespan ts)

public static string gettoken(string username)

public static bool checkauth(string token)

else}}

如**所示,我們實現了驗證token建立、驗證token獲取、驗證token校驗三個方法。

到此,我們的基礎**已經編寫完了,下面進入驗證的應用。

fliter

首先,在global.asax檔案中,為我們webapi新增乙個過濾器,**如下:

} **中建立了四個過濾器,分別是mvc的請求和異常過濾器和webapi的請求和異常過濾器。

這裡我們主要看webapi的請求過濾器——httppermissionfilter。**如下:

}我們的httppermissionfilter類繼承了system.web.http.filters.actionfilterattribute,這樣他就可以截獲所有的webapi請求了。

然後我們重寫了他的onactionexecuting方法,在方法裡,我們查詢到當前請求的controller的名稱,然後對其進行了乙個簡單的判斷,如果是login(登入)或loginout(登出),那我們就不對他的token進行驗證。如果是其他請求,則會從請求的headers的authorization屬性裡讀取token,並使用authenticationhelper類對這個token進行正確性的驗證。

webapi介面

現在我們編寫webapi介面,編寫乙個登入介面和乙個普通請求介面。

登入介面:這裡我們使用authenticationhelper類建立乙個token,並把他儲存到快取中。

然後再把token返回給呼叫者。

普通介面:這裡我們不做任何操作,就是簡單的返回成功,因為是否可以訪問這個介面,已經又filter控制了。

**如下:

public class logincontroller : apicontroller  }

public class requestcontroller : apicontroller

}

測試頁面

現在我們編寫測試頁面,這裡我們實現三個按鈕,登入、帶token訪問api、無token訪問api。

**如下:

登入

帶token訪問api

無token訪問api

測試結果如下:

如上圖所示,我們已經成功實現簡單的token驗證。

到此jwt的實戰應用就已經介紹完了。

,非常感謝!

輕量級Django 第2章 無狀態的Web應用

佔位伺服器 接收乙個帶有指定大小 顏色,文字等 的url並生成該。通過正則中的?p語法來捕獲被命名的組,之後用 0 9 來匹配數字 試驗 compile re.compile image p 0 9 x p 0 9 str image 12x21 compile.search str sre.sre...

紅黑樹的實現與驗證 C

紅黑樹的實現與驗證 c 紅黑樹例項 在說紅黑樹之前,我們先來認識一下它 首先強調一點 紅黑樹也是二叉搜尋樹。那麼它就滿足二叉搜尋樹的性質,除此之外,他還有幾個比較特殊的性質,了解這些,有助於我們後面的分析 性質 1 紅黑樹所有的節點都有顏色 紅或黑 2 紅黑樹的根結點是黑色的 3 紅黑樹的兩個紅色節...

基於C語言的狀態機實現技術

一 簡介 有限狀態機是一種用來進行物件行為建模的工具,其作用主要是描述物件在它的生命週期內所經歷的狀態序列,以及如何響應來自外界的各種事件。有限狀態機 finite state machine或者finite state automata 是軟體領域中一種重要的工具,很多東西的模型實際上就是有限狀態...