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

歡迎訪問 生活随笔!

生活随笔

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

asp.net

.NET Core中的认证管理解析

發(fā)布時間:2023/12/4 asp.net 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET Core中的认证管理解析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

0x00 問題來源

在新建.NET Core的Web項目時選擇“使用個人用戶賬戶”就可以創(chuàng)建一個帶有用戶和權(quán)限管理的項目,已經(jīng)準備好了用戶注冊、登錄等很多頁面,也可以使用AuthorizeAttribute進行各種權(quán)限管理,看起來似乎十分方便。不過生成的代碼都替我干了些什么我一團霧水。看了下生成的數(shù)據(jù)表,功能也挺復雜的。實際上我需要的只是基于用戶和角色的認證管理,而且用戶資料是使用現(xiàn)有的庫,但使用.NET Core自帶的認證組件必須要依賴EF,表的結(jié)構(gòu)也很多對不上,所以學習了下自帶的認證組件的實現(xiàn),然后自己寫了個認證服務(wù)替換了Identity組件,同時Cookie管理使用自帶的Cookie中間件、可以使用AuthorizeAttribute進行認證。復雜的需求還沒遇到,所以就學習到了這里。這篇博客主要討論最簡單情況下的的基于用戶和角色的認證。關(guān)于.NET Core自帶認證組件的一些基本用法,可以參考https://docs.asp.net/en/latest/security/authentication/accconfirm.html。

0x01 .NET Core中的認證管理

提到認證管理,首相想到的就是用戶的注冊、登錄、注銷以及給用戶添加/刪除角色等功能。其中用戶信息,角色信息等都是保存在數(shù)據(jù)庫中的。所以主要包含數(shù)據(jù)庫操作和登錄業(yè)務(wù)邏輯兩部分。在登錄業(yè)務(wù)邏輯層面,.NET Core主要通過三個比較核心的類UserManager、RoleManager、SigninManager進行管理(在Microsoft.AspNetCore.Identity程序集)。其中:

  • UserManager主要負責用戶的認證、注冊、修改、刪除以及與用戶相關(guān)的角色、令牌、聲明等的管理。

  • RoleManager負責角色、角色相關(guān)聲明的管理。

  • SigninManager負責登錄、注銷等相關(guān)操作。在涉及到用戶操作(如登陸時用戶驗證)會調(diào)用UserManager進行操作。

這三個核心類在操作數(shù)據(jù)庫時,使用數(shù)據(jù)庫層面的UserStore、RoleStore進行操作(在Microsoft.AspNetCore.Identity.EntityFrameworkCore程序集)。業(yè)務(wù)關(guān)系如下圖所示:

?

我們在開發(fā)認證相關(guān)功能時使用這三個核心類即可滿足大多數(shù)需求。我們在使用這幾個核心類的對象時都是通過依賴注入獲取的,那么這些相關(guān)的依賴是什么時候注入的呢?在Startup的ConfigureServices方法中有AddIdentity擴展方法,就是在這個方法中添加了需要的所有依賴。

0x02 登錄和注銷

了解了Identity組件的整體分工后,再來看一下登錄和注銷的操作的部分細節(jié)。登錄和注銷過程主要由SigninManager負責,的先來看一下登錄的過程:

?

登錄成功后Response的Header中包含了Set-Cookie,Cookie的Key需要和Cookie中間件中設(shè)置的要解密的Cookie的Key一致,在截圖中這個Cookie的Key是IdentityCookie。設(shè)置Cookie的同時返回302重定向到登錄頁面。

?

重定向到登陸頁面時,請求中已經(jīng)帶有設(shè)置的Key為IdentityCookie的Cookie了。

?

注銷過程比較簡單,調(diào)用HttpContext.Authentication.SignOutAsync方法即可注銷,此時會給HttpContext.Response添加Set-Cookie,但內(nèi)容為空。

0x03 通過Cookie識別用戶

.NET Core中通過CookieAuthenticationMiddleware這個中間件識別HttpContext中認證相關(guān)的Cookie,從而添加用戶的驗證和授權(quán)信息。最關(guān)鍵的是ClaimsPrincipal對象,它記錄用戶的認證和授權(quán)信息(除此之外當然也可以包含其它你需求的任意信息),從上面登錄過程可以看到,登錄成功后用戶認證和授權(quán)信息保存至ClaimsPrincipal對象(實際上對于這條Cookie鍵值對中的認證信息保存為ClaimsIdentity,一個ClaimsPrincipal可以包含多個ClaimsIdentity),然后在HttpContext.Response的Headers中添加Set-Cookie,Key為Cookie中間件中指定的CookieName,Value就是這個對象加密后的字符串。以后的HttpContext都會帶有這個Cookie,Cookie中間件會把符合這個CookieName的Cookie取出來,解密并還原為ClaimsPrincipal對象,并把HttpContext.User設(shè)置為這個對象。后面MVC中間件在路由到相應Controller和Action的時候就可以根據(jù)Authorize特性中指定的認證和角色在HttpContext.User中進行檢查,不滿足檢查則跳轉(zhuǎn)至相應頁面。因此需要注意的就是一定要把Cookie中間件放在MVC中間件之前。

這里需要特別說一下ClaimsPrincipal。一個ClaimsPrincipal對象中包含了一個或多個ClaimsIdentity對象,一個ClaimsIdentity對象一般來說對應著一個Cookie中某條鍵值對(個人理解)。Cookie中間件和ClaimsIdentity是通過AuthenticationScheme聯(lián)系起來的。后面我們在寫自己的認證服務(wù)時,也是把Cookie中間件的AuthenticationScheme和創(chuàng)建的ClaimsIdentity一致。所以更準確地說是ClaimsIdentity包含了用戶認證和權(quán)限的聲明,而ClaimsPrincipal可以包含多個ClaimsIdentity。當管道中存在多個Cookie中間件時,通過AuthenticationScheme進行區(qū)分。

在ClaimsIdentity中除了AuthenticationScheme外還有兩個比較重要的屬性,UserType和RoleType,其中UserType指定了用戶驗證類型,RoleType指定可角色驗證類型。意思就是如果我指定了RoleType為”RoleName”,那么在進行角色認證時就會尋找Claims中所有的Type為”RoleName”的值,并檢查其中是否包含了Authorize中指定的RoleName。不過.NET Core中自帶了ClaimTypes,可以直接使用。例如角色類型就是ClaimTypes.Role。如果添加角色時用的自帶的ClaimTypes.Role,那么在創(chuàng)建ClaimsIdentity時就不需要顯示指定RoleType了,默認角色認證就是使用ClaimTypes.Role。

關(guān)于Cookie中間件的添加,是通過Startup中Configure方法中的app.UseIdentity擴展方法實現(xiàn)的。這個擴展方法實際上添加了多種Cookie識別方式。在后面我在寫自己的用戶認證管理時只用一種。

?

0x04 自己寫用戶認證管理

了解了用戶認證的過程,我們可以自己寫認證管理來代替Identity組件了,同樣分為數(shù)據(jù)庫操作和認證業(yè)務(wù)邏輯。數(shù)據(jù)庫相關(guān)就不多說了,都寫到了IdentityRepository類,只有很簡單的數(shù)據(jù)操作。為了方便使用了Dapper,數(shù)據(jù)庫用的Sqlite。程序在啟動時會檢查數(shù)據(jù)庫表,沒有會自動創(chuàng)建空表。

認證服務(wù)也比較簡單就都寫到了IdentityService類,提供了注冊和登錄操作,注銷太簡了直接寫在了Action里。為了方便沒有提供角色管理頁面,如果要測試角色認證功能,需要手動去數(shù)據(jù)庫添加Role,然后在UserRoles中給用戶添加Role。

?

登錄:

注冊:

注銷:

具體示例可以到:

https://github.com/durow/NetCoreStudy

只是為了測試,邏輯上很多問題,比如用戶密碼明文存儲。重點看過程:)

0x05 寫在最后

第一次接觸Web應用,很多概念都不是很了解。就拿Cookie認證用戶來說,我之前的只知道通過Cookie識別用戶,一直以為是收到Cookie后再從數(shù)據(jù)庫或緩存中查出相應的權(quán)限信息。不過看了自帶的Cookie中間件代碼后才知道認證信息是直接存在Cookie中的,這樣只要解密后反序列化就可以了。Identity這個程序集涉及了很多其它程序集(Security、HttpAbstraction等等),看得我很暈,最后總算搞明白了一些,很多細節(jié)也沒去深究,文中內(nèi)容有的基于代碼,有的基于個人理解,有錯誤希望大家嘴下留情。

原文地址:http://www.cnblogs.com/durow/p/5783089.html


.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關(guān)注

總結(jié)

以上是生活随笔為你收集整理的.NET Core中的认证管理解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。