深入解讀ASP.NET Core身份認(rèn)證過程實(shí)現(xiàn)
長話短說:上文我們講了 ASP.NET Core 基于聲明的訪問控制到底是什么鬼?
今天我們乘勝追擊:聊一聊ASP.NET Core 中的身份驗(yàn)證。
身份驗(yàn)證是確定用戶身份的過程。 授權(quán)是確定用戶是否有權(quán)訪問資源的過程。
1. 萬變不離其宗
顯而易見,一個常規(guī)的身份認(rèn)證用例包括兩部分:
① 對用戶進(jìn)行身份驗(yàn)證
② 在未經(jīng)身份驗(yàn)證的用戶試圖訪問受限資源時作出反應(yīng)
已注冊的身份驗(yàn)證處理程序及其配置選項(xiàng)被稱為“方案”,方案可用作一種機(jī)制,供用戶參考相關(guān)處理程序的身份驗(yàn)證、挑戰(zhàn)和禁止行為。
我們口頭上常說的:
基于cookie認(rèn)證方案,若認(rèn)證成功,go on,若認(rèn)證失敗則跳轉(zhuǎn)回登錄頁面;
基于基本身份認(rèn)證(BA)方案,若認(rèn)證成功,go on,若認(rèn)證失敗則給瀏覽器返回WWW-Authenticate標(biāo)頭, 瀏覽器會再次彈出認(rèn)證窗口。
2. ASP.NET Core認(rèn)證原理
在 ASP.NET Core 中,身份驗(yàn)證由IAuthenticationService負(fù)責(zé),身份驗(yàn)證服務(wù)會調(diào)用已注冊的身份驗(yàn)證處理程序來完成與身份驗(yàn)證相關(guān)的操作, 整個驗(yàn)證過程由認(rèn)證中間件來串聯(lián)。
其中有幾個關(guān)鍵步驟
1、認(rèn)證處理程序
可結(jié)合方案Scheme中的配置項(xiàng)AuthenticationSchemeOptions編寫認(rèn)證處理程序。
基于Cookie的認(rèn)證方案可在Options項(xiàng)中可指定登錄地址,
基于基本身份的認(rèn)證方案可在Options項(xiàng)中指定用戶名/密碼;
2、身份認(rèn)證程序繼承自AuthenticationHandler類或IAuthenticationHandler接口。
核心認(rèn)證函數(shù)可落地基于聲明的訪問控制,生成綁定了ClaimsPrincipal、Scheme的AuthenticationTicket對象; 無論認(rèn)證成功/失敗,函數(shù)返回AuthenticateResult對象。
挑戰(zhàn)(對未認(rèn)證的用戶做出的反應(yīng)): 例如返回登錄頁面
禁止(對已認(rèn)證,但對特定資源無權(quán)訪問做出的反應(yīng)) : 例如返回提示字符串
以上均為服務(wù)注冊過程
收到請求,認(rèn)證中間件使用IAuthenticationService對HttpContext按照要求的scheme進(jìn)行認(rèn)證, 實(shí)際內(nèi)部會調(diào)用第2步編寫的認(rèn)證處理程序。
以上認(rèn)證原理,之前有一個近身實(shí)戰(zhàn): ASP.NET Core 實(shí)現(xiàn)基本身份驗(yàn)證。
源代碼如下:http://www.dbjr.com.cn/article/196974.htm
3. ASP.NET Core獲取當(dāng)前用戶
基于聲明的訪問控制, 我們會在HttpContext.User屬性存儲身份信息。
var claims = new[] { new Claim(ClaimTypes.NameIdentifier,username), new Claim(ClaimTypes.Name,username), }; var identity = new ClaimsIdentity(claims, Scheme.Name); var principal = new ClaimsPrincipal(identity); Context.User = principal;
Web應(yīng)用程序中獲取當(dāng)前登錄用戶, 有兩種代碼場合:
3.1 在控制器中獲取當(dāng)前登錄用戶
控制器是處理請求的 一等公民,天生自帶HttpContext。
直接通過ControllerBase基類中包含的HttpContext屬性,獲取User對象。
實(shí)際上Razor Page、Razor View、Middleware均包含HttpContext屬性/參數(shù), 可直接使用。
3.2 在服務(wù)中獲取當(dāng)前登錄用戶
這個時候,服務(wù)是作為請求處理中的一個環(huán)節(jié),并沒有直接可用的HttpContext。
ASP.NET Core 提供了IHttpContextAccessor類能夠注入此次請求中的HttpContext對象(依賴注入框架的作用)。
// 下面的用戶實(shí)體類,需要獲取當(dāng)前登錄用戶,借助IHttpContextAccessor注入httpContext public class UserEntityService : IUserEntityService { private IHttpContextAccessor _accessor; private readonly IMongoCollection<UserProfile> _users; public UserEntityService(IHttpContextAccessor accessor, IDefaultMongoDatabaseProvider databaseProvider) { _accessor = accessor; _users = databaseProvider.GetCollection<UserProfile>(CollectionNames.UserProfiles); } public Task<UserProfile> GetCurrentUserAsync() { var rawUser = this._accessor.HttpContext.User(); if (rawUser == null) { return null; } var filter = Builders<UserProfile>.Filter.Eq("UserId", rawUser.UserId); return _users.Find(filter).FirstOrDefaultAsync(); } }
我們不需要區(qū)分以上代碼場合,在Controller或者Application 服務(wù)中使用ICurrentUser接口拿到登錄用戶。
旁白
個人認(rèn)為,ASP.NET Core身份認(rèn)證的源代碼, 基于現(xiàn)實(shí)認(rèn)知提煉而來,讓我們驚嘆于框架代碼的的簡潔精煉、層次分明。
基于聲明的訪問控制已成標(biāo)準(zhǔn),ASP.NET Core/abp vnext 均提供了完善的支持。
到此這篇關(guān)于深入解讀ASP.NET Core身份認(rèn)證過程實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)ASP.NET Core 身份認(rèn)證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- ASP.NET Core3.1 Ocelot認(rèn)證的實(shí)現(xiàn)
- ASP.NET Core使用JWT認(rèn)證授權(quán)的方法
- ASP.NET Core 實(shí)現(xiàn)基本認(rèn)證的示例代碼
- ASP.NET Core學(xué)習(xí)之使用JWT認(rèn)證授權(quán)詳解
- ASP.NET Core Authentication認(rèn)證實(shí)現(xiàn)方法
- Asp.net Core中實(shí)現(xiàn)自定義身份認(rèn)證的示例代碼
- 淺談ASP.NET Core 中jwt授權(quán)認(rèn)證的流程原理
- ASP.Net Core3.0中使用JWT認(rèn)證的實(shí)現(xiàn)
- Asp.Net Core基于JWT認(rèn)證的數(shù)據(jù)接口網(wǎng)關(guān)實(shí)例代碼
- ASP.NET學(xué)習(xí)CORE中使用Cookie身份認(rèn)證方法
- Asp.Net Core添加請求頭自定義認(rèn)證的示例
相關(guān)文章
輕量級ORM框架Dapper應(yīng)用之實(shí)現(xiàn)Join操作
本文詳細(xì)講解了使用Dapper實(shí)現(xiàn)Join操作,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03MVC+EasyUI+三層架構(gòu)簡單權(quán)限管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了MVC+EasyUI+三層架構(gòu)簡單權(quán)限管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-07-07Asp.net把圖片存入數(shù)據(jù)庫和讀取圖片的方法
網(wǎng)上關(guān)于ASP.NET上傳圖片到數(shù)據(jù)庫的資料非常多,常用的如下:存儲圖片類型數(shù)據(jù)有以下幾種方式2013-07-07ASP.NET在MVC中MaxLength特性設(shè)置無效的解決方法
這篇文章主要介紹了ASP.NET在MVC中MaxLength特性設(shè)置無效的解決方法,涉及對MVC中表單元素屬性的應(yīng)用技巧,需要的朋友可以參考下2014-11-11asp.net生成Excel并導(dǎo)出下載五種實(shí)現(xiàn)方法
有關(guān)Excel下載的文章網(wǎng)上想必有很多,利用閑暇時間整理了一些有Excel下載方法的文章,接下來介紹五種實(shí)現(xiàn)Excel下載的方法,感興趣的朋友可以了解下,或許對你學(xué)習(xí)Excel下載有所幫助2013-02-02ASP.NET存儲過程實(shí)現(xiàn)分頁效果(三層架構(gòu))
這篇文章主要為大家詳細(xì)介紹了ASP.NET存儲過程實(shí)現(xiàn)分頁,利用三層架構(gòu)實(shí)現(xiàn)分頁效果,有參考價值的一篇文章,感興趣的小伙伴們可以參考一下2016-05-05