实战解读ASP.NET Core身份认证
長話短說:上文我們聊了?ASP.NET Core 基于聲明的訪問控制到底是什么鬼?
今天我們乘勝追擊:聊一聊ASP.NET Core 中的身份驗(yàn)證。
身份驗(yàn)證是確定用戶身份的過程。授權(quán)是確定用戶是否有權(quán)訪問資源的過程。
1. 萬變不離其宗
顯而易見,一個(gè)常規(guī)的身份認(rèn)證用例包括兩部分:
① 對(duì)用戶進(jìn)行身份驗(yàn)證
② 在未經(jīng)身份驗(yàn)證的用戶試圖訪問受限資源時(shí)作出反應(yīng)
已注冊(cè)的身份驗(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)頭, 瀏覽器會(huì)再次彈出認(rèn)證窗口。
2. ASP.NET Core認(rèn)證原理
在 ASP.NET Core 中,身份驗(yàn)證由IAuthenticationService負(fù)責(zé),身份驗(yàn)證服務(wù)會(huì)調(diào)用已注冊(cè)的身份驗(yàn)證處理程序來完成與身份驗(yàn)證相關(guān)的操作, 整個(gè)驗(yàn)證過程由認(rèn)證中間件來串聯(lián)。
一圖以蔽之:
其中有幾個(gè)關(guān)鍵步驟
添加認(rèn)證方案
由配置項(xiàng)AuthenticationSchemeOption、認(rèn)證處理程序組成。
基于Cookie的認(rèn)證方案可在Options項(xiàng)中可指定登錄地址,
基于基本身份的認(rèn)證方案可在Options項(xiàng)中指定用戶名/密碼;
認(rèn)證處理程序? ?繼承AuthenticationHandler類或IAuthenticationHandler接口
核心認(rèn)證函數(shù):? ?可落地基于聲明的訪問控制,生成綁定了ClaimsPrincipal、Scheme的AuthenticationTicket;?無論認(rèn)證成功/失敗,函數(shù)返回AuthenticateResut對(duì)象。
挑戰(zhàn)(對(duì)未認(rèn)證的用戶做出的反應(yīng)):? 例如返回登錄頁面
禁止(對(duì)已認(rèn)證,但對(duì)特定資源無權(quán)訪問做出的反應(yīng)) :例如返回提示字符串
以上均為服務(wù)注冊(cè)過程
收到請(qǐng)求,認(rèn)證中間件使用IAuthenticationService對(duì)HttpContext按照要求的scheme進(jìn)行認(rèn)證, 實(shí)際內(nèi)部會(huì)調(diào)用第2步編寫的認(rèn)證處理程序。
以上認(rèn)證原理,有一個(gè)近身實(shí)戰(zhàn):ASP.NET Core 實(shí)現(xiàn)基本身份驗(yàn)證。
源代碼如下:https://www.cnblogs.com/JulianHuang/p/10345365.html
3. ASP.NET Core獲取當(dāng)前用戶
基于聲明的訪問控制, 我們會(huì)在HttpContext.User屬性存儲(chǔ)身份信息。
?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)前登錄用戶, 有兩種代碼場(chǎng)合:
3.1 在控制器中獲取當(dāng)前登錄用戶
控制器是處理請(qǐng)求的 一等公民,天生自帶HttpContext。
直接通過ControllerBase基類中包含的HttpContext屬性,獲取User對(duì)象。
實(shí)際上Razor Page、Razor View、Middleware均包含HttpContext屬性/參數(shù), 可直接使用。
3.2 在服務(wù)中獲取當(dāng)前登錄用戶
這個(gè)時(shí)候,服務(wù)是作為請(qǐng)求處理中的一個(gè)環(huán)節(jié),并沒有直接可用的HttpContext。
ASP.NET Core 提供了IHttpContextAccessor能夠注入此次請(qǐng)求中的HttpContext對(duì)象(依賴注入框架的作用)。
+ abp vnext
我們不需要區(qū)分以上代碼場(chǎng)合,在Controller或者Application 服務(wù)中使用ICurrentUser接口拿到登錄用戶。
旁白
個(gè)人認(rèn)為,ASP.NET Core身份認(rèn)證的源代碼, 基于現(xiàn)實(shí)認(rèn)知提煉而來,讓我們驚嘆于框架代碼的的簡(jiǎn)潔精煉、層次分明。
基于聲明的訪問控制已成標(biāo)準(zhǔn),ASP.NET Core/abp vnext 均提供了完善的支持。
ASP.NET Core端點(diǎn)路由作用原理
臨近年關(guān),修復(fù)ASP.NET Core因?yàn)g覽器內(nèi)核版本引發(fā)的單點(diǎn)登錄故障
手撕公司SSO登錄原理
Quartz.net在集群環(huán)境下部署任務(wù)的姿勢(shì)
ASP.NET Core應(yīng)用注意這一點(diǎn),CTO會(huì)對(duì)你刮目相看
更多精彩
掃碼關(guān)注
? ? ? ? ? ?繪圖+文字均為原創(chuàng), 覺得有用,麻煩三連 ~..~
總結(jié)
以上是生活随笔為你收集整理的实战解读ASP.NET Core身份认证的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: netcore使用 jenkins +
- 下一篇: 在.NET中使用DiagnosticSo