您好,登錄后才能下訂單哦!
這篇文章主要介紹“ASP.NET Core身份認(rèn)證過(guò)程是如何實(shí)現(xiàn)的”,在日常操作中,相信很多人在ASP.NET Core身份認(rèn)證過(guò)程是如何實(shí)現(xiàn)的問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”ASP.NET Core身份認(rèn)證過(guò)程是如何實(shí)現(xiàn)的”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
今天我們聊一聊ASP.NET Core 中的身份驗(yàn)證。
身份驗(yàn)證是確定用戶(hù)身份的過(guò)程。 授權(quán)是確定用戶(hù)是否有權(quán)訪(fǎng)問(wèn)資源的過(guò)程。
1. 萬(wàn)變不離其宗
顯而易見(jiàn),一個(gè)常規(guī)的身份認(rèn)證用例包括兩部分:
① 對(duì)用戶(hù)進(jìn)行身份驗(yàn)證
② 在未經(jīng)身份驗(yàn)證的用戶(hù)試圖訪(fǎng)問(wèn)受限資源時(shí)作出反應(yīng)
已注冊(cè)的身份驗(yàn)證處理程序及其配置選項(xiàng)被稱(chēng)為“方案”,方案可用作一種機(jī)制,供用戶(hù)參考相關(guān)處理程序的身份驗(yàn)證、挑戰(zhàn)和禁止行為。
我們口頭上常說(shuō)的:
基于cookie認(rèn)證方案,若認(rèn)證成功,go on,若認(rèn)證失敗則跳轉(zhuǎn)回登錄頁(yè)面;
基于基本身份認(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)證處理程序來(lái)完成與身份驗(yàn)證相關(guān)的操作, 整個(gè)驗(yàn)證過(guò)程由認(rèn)證中間件來(lái)串聯(lián)。
其中有幾個(gè)關(guān)鍵步驟
1、認(rèn)證處理程序
可結(jié)合方案Scheme中的配置項(xiàng)AuthenticationSchemeOptions編寫(xiě)認(rèn)證處理程序。
基于Cookie的認(rèn)證方案可在Options項(xiàng)中可指定登錄地址,
基于基本身份的認(rèn)證方案可在Options項(xiàng)中指定用戶(hù)名/密碼;
2、身份認(rèn)證程序繼承自AuthenticationHandler類(lèi)或IAuthenticationHandler接口。
核心認(rèn)證函數(shù)可落地基于聲明的訪(fǎng)問(wèn)控制,生成綁定了ClaimsPrincipal、Scheme的AuthenticationTicket對(duì)象; 無(wú)論認(rèn)證成功/失敗,函數(shù)返回AuthenticateResult對(duì)象。
挑戰(zhàn)(對(duì)未認(rèn)證的用戶(hù)做出的反應(yīng)): 例如返回登錄頁(yè)面
禁止(對(duì)已認(rèn)證,但對(duì)特定資源無(wú)權(quán)訪(fǎng)問(wèn)做出的反應(yīng)) : 例如返回提示字符串
以上均為服務(wù)注冊(cè)過(guò)程
收到請(qǐng)求,認(rèn)證中間件使用IAuthenticationService對(duì)HttpContext按照要求的scheme進(jìn)行認(rèn)證, 實(shí)際內(nèi)部會(huì)調(diào)用第2步編寫(xiě)的認(rèn)證處理程序。
以上認(rèn)證原理,之前有一個(gè)近身實(shí)戰(zhàn): ASP.NET Core 實(shí)現(xiàn)基本身份驗(yàn)證。
源代碼如下:https://www.jb51.net/article/196974.htm
3. ASP.NET Core獲取當(dāng)前用戶(hù)
基于聲明的訪(fǎng)問(wèn)控制, 我們會(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)前登錄用戶(hù), 有兩種代碼場(chǎng)合:
3.1 在控制器中獲取當(dāng)前登錄用戶(hù)
控制器是處理請(qǐng)求的 一等公民,天生自帶HttpContext。
直接通過(guò)ControllerBase基類(lèi)中包含的HttpContext屬性,獲取User對(duì)象。
實(shí)際上Razor Page、Razor View、Middleware均包含HttpContext屬性/參數(shù), 可直接使用。
3.2 在服務(wù)中獲取當(dāng)前登錄用戶(hù)
這個(gè)時(shí)候,服務(wù)是作為請(qǐng)求處理中的一個(gè)環(huán)節(jié),并沒(méi)有直接可用的HttpContext。
ASP.NET Core 提供了IHttpContextAccessor類(lèi)能夠注入此次請(qǐng)求中的HttpContext對(duì)象(依賴(lài)注入框架的作用)。
// 下面的用戶(hù)實(shí)體類(lèi),需要獲取當(dāng)前登錄用戶(hù),借助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ū)分以上代碼場(chǎng)合,在Controller或者Application 服務(wù)中使用ICurrentUser接口拿到登錄用戶(hù)。
旁白
個(gè)人認(rèn)為,ASP.NET Core身份認(rèn)證的源代碼, 基于現(xiàn)實(shí)認(rèn)知提煉而來(lái),讓我們驚嘆于框架代碼的的簡(jiǎn)潔精煉、層次分明。
基于聲明的訪(fǎng)問(wèn)控制已成標(biāo)準(zhǔn),ASP.NET Core/abp vnext 均提供了完善的支持。
到此,關(guān)于“ASP.NET Core身份認(rèn)證過(guò)程是如何實(shí)現(xiàn)的”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。