ASP.NET?Core框架探索之Authentication的權(quán)限認(rèn)證過(guò)程解析
今天我們來(lái)探索一下ASP.NET Core中關(guān)于權(quán)限認(rèn)證,所謂權(quán)限認(rèn)證,就是通過(guò)某些方式獲取到用戶的信息。
需要開(kāi)啟權(quán)限認(rèn)證,我們首先需要在容器中注入認(rèn)證服務(wù),使用services.AddAuthentication。進(jìn)入該方法的源碼,最重要的其實(shí)就是AddAuthenticationCore方法,他向容器中注入了認(rèn)證體系中很重要的對(duì)象:IAuthenticationService、IAuthenticationHandlerProvider、IAuthenticationSchemeProvider
public static IServiceCollection AddAuthenticationCore(this IServiceCollection services)
{
if (services == null)
{
throw new ArgumentNullException(nameof(services));
}
services.TryAddScoped<IAuthenticationService, AuthenticationService>();
services.TryAddSingleton<IClaimsTransformation, NoopClaimsTransformation>(); // Can be replaced with scoped ones that use DbContext
services.TryAddScoped<IAuthenticationHandlerProvider, AuthenticationHandlerProvider>();
services.TryAddSingleton<IAuthenticationSchemeProvider, AuthenticationSchemeProvider>();
return services;
}然后還需要在Configure管道處理中加上需要權(quán)限認(rèn)證app.UseAuthentication(),該方法會(huì)向處理管道中添加名為AuthenticationMiddleware的中間件,具體一個(gè)請(qǐng)求到來(lái)時(shí),框架是如何進(jìn)行權(quán)限認(rèn)證的處理邏輯都在這里。
下面我們就大致討論一下AuthenticationMiddleware中間件中對(duì)于權(quán)限認(rèn)證過(guò)程的細(xì)節(jié):
1、請(qǐng)求進(jìn)入認(rèn)證環(huán)節(jié),首先會(huì)進(jìn)入IAuthenticationSchemeProvider對(duì)象拿到AuthenticationOptions對(duì)象中的IList<AuthenticationSchemeBuilder>集合,所有注冊(cè)到認(rèn)證體系中的認(rèn)證方案都會(huì)在該集合中拿到。
2、通過(guò)循環(huán)集合,調(diào)用AuthenticationSchemeBuilder對(duì)象的Builder方法去獲得所有的認(rèn)證方案AuthenticationScheme,將得到的AuthenticationScheme以AuthenticationScheme.Name作為key保存到AuthenticationSchemeProvider對(duì)象的字典集合IDictionary<string, AuthenticationScheme>中,這樣AuthenticationSchemeProvider就擁有了返回AuthenticationScheme的能力,通過(guò)傳入認(rèn)證方案名稱,即可得到方案對(duì)象。
3、拿到了AuthenticationScheme對(duì)象,其認(rèn)證處理類型即可在HandlerType屬性中得到,然后在IAuthenticationHandlerProvider的實(shí)例對(duì)象中根據(jù)HandlerType創(chuàng)建一個(gè)認(rèn)證處理對(duì)象IAuthenticationHandler,最后調(diào)用該對(duì)象的AuthenticateAsync方法就是完成具體的認(rèn)證處理邏輯。需要注意的是這里的IAuthenticationHandler對(duì)象會(huì)根據(jù)每個(gè)AuthenticationScheme具備的認(rèn)證處理邏輯而來(lái),所以得到的AuthenticationScheme不同,認(rèn)證處理的邏輯就不同。
下圖是我針對(duì)認(rèn)證流程畫(huà)的一個(gè)的大致過(guò)程:

以上就是用戶認(rèn)證體系中大致認(rèn)證邏輯,當(dāng)然通過(guò)以上的描述還會(huì)存在以下疑點(diǎn):
1、進(jìn)入認(rèn)證環(huán)節(jié)后,AuthenticationSchemeProvider可能會(huì)擁有很多個(gè)AuthenticationScheme,需要通過(guò)傳入某個(gè)認(rèn)證方案名稱來(lái)拿到具體的AuthenticationScheme,那么這個(gè)傳入的動(dòng)作是在哪里呢?
2、AuthenticationSchemeProvider對(duì)象在實(shí)例化的時(shí)候從AuthenticationOptions對(duì)象中獲取IList<AuthenticationSchemeBuilder>集合進(jìn)行循環(huán)Builder得到AuthenticationScheme,那AuthenticationOptions中該集合的數(shù)據(jù)是在什么時(shí)候添加進(jìn)去的呢?
3、如何在認(rèn)證體系中添加需要的AuthenticationScheme呢?
以Cookie為例,我們會(huì)在向容器添加認(rèn)證服務(wù)的時(shí)候就會(huì)指定默認(rèn)的認(rèn)證方案名稱:service.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme),方法返回AuthenticationBuilder,但此刻還只是組建了認(rèn)證服務(wù)的框架,還需要向這個(gè)框架中添加處理認(rèn)證的方案,所以會(huì)通過(guò)AuthenticationBuilder.AddCookie將Cooike的認(rèn)證方案添加進(jìn)來(lái),當(dāng)然我們可以添加很多個(gè)方案,比如使用JWT進(jìn)行認(rèn)證,但實(shí)際認(rèn)證過(guò)程還是根據(jù)傳遞的默認(rèn)方案的名稱進(jìn)行的。
到此這篇關(guān)于ASP.NET Core框架探索之Authentication的文章就介紹到這了,更多相關(guān)ASP.NET Core Authentication內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
asp.net mvc webapi 實(shí)用的接口加密方法示例
本篇文章主要介紹了asp.net mvc webapi 實(shí)用的接口加密方法示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
.NET Core系列之MemoryCache 初識(shí)
Cache是一個(gè)絕大多數(shù)項(xiàng)目會(huì)用到的一個(gè)技術(shù),這篇文章主要介紹了.NET Core系列之MemoryCache 初識(shí),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
ASP.NET生成兩個(gè)日期范圍內(nèi)隨機(jī)時(shí)間的實(shí)現(xiàn)方法
這篇文章主要介紹了ASP.NET生成兩個(gè)日期范圍內(nèi)隨機(jī)時(shí)間的實(shí)現(xiàn)方法,通過(guò)自定義函數(shù)記錄開(kāi)始時(shí)間與結(jié)束時(shí)間確定時(shí)間范圍進(jìn)而生成該時(shí)間段的隨機(jī)時(shí)間,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-12-12
asp.net uploadify實(shí)現(xiàn)多附件上傳功能
這篇文章主要為大家詳細(xì)介紹了asp.net uploadify實(shí)現(xiàn)多附件上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
c#生成圖片縮略圖的類(2種實(shí)現(xiàn)思路)
4個(gè)重載方法,有直接返回Image對(duì)象的,有生成縮略圖,并且保存到指定目錄的,具體祥看下文2013-05-05
ASP.NET?Core?WebApi返回結(jié)果統(tǒng)一包裝實(shí)踐記錄
本文主要是展示了針對(duì)ASP.NET Core WeApi結(jié)果統(tǒng)一返回格式的相關(guān)操作,通過(guò)示例我們一步一步的展示了完成這一目標(biāo)的不斷升級(jí)的實(shí)現(xiàn),雖然整體看起來(lái)比較簡(jiǎn)單,但是卻承載著筆者一次又一次的思考升級(jí)2022-04-04
asp.net 頁(yè)面?zhèn)髦档膸讉€(gè)方法
在網(wǎng)頁(yè)應(yīng)用程序的開(kāi)發(fā)中,頁(yè)面之間的傳值應(yīng)該是最常見(jiàn)的問(wèn)題了。2009-11-11
asp.net+ajaxfileupload.js 實(shí)現(xiàn)文件異步上傳代碼分享
本文給大家分享一段asp.net基于ajaxfileupload.js實(shí)現(xiàn)文件異步上傳的代碼,本人項(xiàng)目中已經(jīng)在使用的代碼,小伙伴們可以直接移植到自己的項(xiàng)目中去。2014-11-11
asp.net 虛擬主機(jī)時(shí)常出現(xiàn)MAC驗(yàn)證失敗錯(cuò)誤之解決方法
驗(yàn)證視圖狀態(tài) MAC 失敗。如果此應(yīng)用程序由網(wǎng)絡(luò)場(chǎng)或群集承載,請(qǐng)確保 <machineKey> 配置指定了相同的 validationKey 和驗(yàn)證算法。不能在群集中使用 AutoGenerate。2009-05-05

