日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.Net Core手撸一个基于Token的权限认证

發布時間:2023/12/4 asp.net 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .Net Core手撸一个基于Token的权限认证 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

說明

權限認證是確定用戶身份的過程。可確定用戶是否有訪問資源的權力

今天給大家分享一下類似JWT這種基于token的鑒權機制

基于token的鑒權機制,它不需要在服務端去保留用戶的認證信息或者會話信息。這就意味著基于token認證機制的應用,不需要去考慮用戶在哪一臺服務器登錄了,這就為應用的擴展提供了便利。

流程上是這樣的:

?用戶使用用戶名密碼來請求服務器?服務器進行驗證用戶的信息?服務器通過驗證發送給用戶一個token?客戶端存儲token,并在每次請求時附送上這個token值?服務端驗證token值,并返回數據

那我今天給大家手擼一個類似Jwt的權限認證

演示

新建一個授權篩選器繼承IAuthorizationFilter

public?class?ApiAuthorize?:?IAuthorizationFilter{}

新建一個需要應用授權的特性和允許未通過身份驗證也可以訪問的特性

public?class?MyAuthentication:Attribute,?IFilterMetadata{}public?class?MyNoAuthentication?:?Attribute,?IFilterMetadata{}

我們需要在我們的授權過濾器判斷請求頭是否帶有應用授權的特性和允許未通過身份驗證也可以訪問的特性,如果有允許未通過身份驗證也可以訪問的特性就直接進入下一個管道 ,如果帶有應用授權的特性則進行token判斷

public?class?ApiAuthorize?:?IAuthorizationFilter{public?void?OnAuthorization(AuthorizationFilterContext?context){if?(context.Filters.Contains(new?MyNoAuthentication())){return;}var?authorize?=?context.HttpContext.Request.Headers["MyAuthentication"];if?(string.IsNullOrWhiteSpace(authorize)){context.Result?=?new?JsonResult("請求authorize不能為空");return;}if?(!MemoryCacheHelper.Exists(authorize)){context.Result?=?new?JsonResult("無效的授權信息或授權信息已過期");return;}}}

可能有的小伙伴發現了,那我們Token怎么去存取呢,一般的方案是使用Cache來處理,這里就不做過多討論了,有想了解的小伙伴可以看我上一篇文章!

CacheHelper代碼

public?class?MemoryCacheHelper{public?static?MemoryCache?_cache?=?new?MemoryCache(new?MemoryCacheOptions());///?<summary>///?驗證緩存項是否存在///?</summary>///?<param?name="key">緩存Key</param>///?<returns></returns>public?static?bool?Exists(string?key){if?(key?==?null){throw?new?ArgumentNullException(nameof(key));}return?_cache.TryGetValue(key,?out?_);}///?<summary>///?獲取緩存///?</summary>///?<param?name="key">緩存Key</param>///?<returns></returns>public?static?object?Get(string?key){if?(key?==?null){throw?new?ArgumentNullException(nameof(key));}if?(!Exists(key))throw?new?ArgumentNullException(nameof(key));return?_cache.Get(key);}///?<summary>///?添加緩存///?</summary>///?<param?name="key">緩存Key</param>///?<param?name="value">緩存Value</param>///?<param?name="expiresSliding">滑動過期時長(如果在過期時間內有操作,則以當前時間點延長過期時間)</param>///?<param?name="expiressAbsoulte">絕對過期時長</param>///?<returns></returns>public?static?bool?AddMemoryCache(string?key,?object?value){if?(key?==?null){throw?new?ArgumentNullException(nameof(key));}if?(value?==?null){throw?new?ArgumentNullException(nameof(value));}_cache.Set(key,?value,new?MemoryCacheEntryOptions(){SlidingExpiration?=?new?TimeSpan(0,?0,?10),Priority?=?CacheItemPriority.NeverRemove,AbsoluteExpiration?=?DateTime.Now.AddMinutes(1)});return?Exists(key);}}

權限認證代碼基本完成了,我們回到剛剛的流程

用戶使用用戶名密碼來請求服務器, 服務器進行驗證用戶的信息,服務器通過驗證發送給用戶一個token

對于一個商用軟件來說絕大多數接口都需要應用授權后才能使用,所以我們注冊到全局, 在StartUp類里面注冊

public?void?ConfigureServices(IServiceCollection?services){services.AddControllers(o=>{o.Filters.Add<ApiAuthorize>();o.Filters.Add<MyAuthentication>();});}

Token生成原理我這里就不做過多解讀了,本例子使用AES加密生成Token 在我們服務端的請求token接口加上允許未通過身份驗證也可以訪問的特性,然后頒發一個Token

[HttpGet("GetToken")] [MyNoAuthentication] public?IActionResult?GetToken(string?UserCode) {string?token=??AESEncrypt.Encrypt(UserCode);MemoryCacheHelper.AddMemoryCache(token,?User);eturn?Ok(token); }

使用Postman請求生成token,如圖所示

然后我們在新增一個需要應用授權的接口,由于我們注冊了全局的應用授權特性就不需要在帶上該特性了

[HttpGet("GetUserInformation")]public?IActionResult?GetUserInformation(){return?Ok(new?{?Name="123",Age=18,Sex="性別"});}

不帶token使用postman請求該接口,如圖所示

帶上token使用postman請求該接口,如圖所示

通過剛才的例子我們清楚了解了權限認證的過程,今天的介紹就到此結束了!

最后大家如果喜歡我的文章,還麻煩給個關注并點個贊, 希望net生態圈越來越好!

總結

以上是生活随笔為你收集整理的.Net Core手撸一个基于Token的权限认证的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。