? ? ? ?不知不覺(jué).Net
          Core已經(jīng)推出到3.1了,大多數(shù)以.Net為技術(shù)棧的公司也開始逐步的切換到了Core,從業(yè)也快3年多了,一直堅(jiān)持著.不管環(huán)境怎么變,堅(jiān)持自己的當(dāng)初的選擇,堅(jiān)持信仰
          .Net
          Core是個(gè)非常優(yōu)秀的框架,如果各位是從WebForm開始,一步步走到今天,自然而然就會(huì)發(fā)現(xiàn).微軟慢慢的開始將整個(gè)框架組件化,不在像以前那樣,所以的東西都傻瓜化,比如WebForm,拖拖控件往往能搞定大部分的事情.Core的擴(kuò)展性很好,將很多選擇權(quán)交給我們自己,而不是強(qiáng)行的讓我們?nèi)ソ邮芩且惶?對(duì)第三方組件的兼容性很好.換句話說(shuō),很多核心組件微軟提供了高層抽象,如果你想換,可以,不想換,也可以,用他默認(rèn)的實(shí)現(xiàn).其他的優(yōu)缺點(diǎn)也不一一細(xì)說(shuō)了,也不是本文的重點(diǎn)。如果時(shí)間允許,建議大家可以深入的研究.Net
          Core的底層.

          1、簡(jiǎn)介

          省去前面的創(chuàng)建Core
          Web項(xiàng)目的一系列操作.VS幫你自動(dòng)化初始化好所有的基礎(chǔ)組件、環(huán)境.第一步就是認(rèn)證.就是登陸.當(dāng)然微軟提供了一套登陸組件.很全,很完善。項(xiàng)目在Core源碼?




          ?Security文件夾下,源碼自行去github下載.里面提供了若干個(gè)認(rèn)證方法,常見(jiàn)的Cookie認(rèn)證、JwtBear認(rèn)證等等.還包括FaceBook、Google等遠(yuǎn)程認(rèn)證方式.



          本文暫時(shí)不講解具體的認(rèn)證方式,主要闡述核心認(rèn)證流程.

          ?

          (1)、認(rèn)證系統(tǒng)的執(zhí)行過(guò)程

          Core啟動(dòng)認(rèn)證系統(tǒng)的方式很簡(jiǎn)單



          ?

          ?很簡(jiǎn)單的一段代碼,看看它干了什么



          ?

          ?很簡(jiǎn)單,注入認(rèn)證中間件,關(guān)于中間件這里就不說(shuō)多,不是文本的重點(diǎn),自行百度.看看中間價(jià)干了什么.



          ?


          ?核心代碼,首先拿到DI中注入的認(rèn)證請(qǐng)求處理器集合,接著去DI中獲取認(rèn)證處理方案集合中的處理認(rèn)證請(qǐng)求上下文的方案類.接著去處理器集合中拿到處理遠(yuǎn)程認(rèn)證請(qǐng)求上下文的方案類對(duì)應(yīng)的認(rèn)證請(qǐng)求處理器,接著執(zhí)行處理器的HandleRequestAsync方法,完成遠(yuǎn)程認(rèn)證的處理.



          ?

          接著



          ?


          ?遠(yuǎn)程認(rèn)證流程執(zhí)行完畢之后,直接return.反之,如果當(dāng)前不是使用遠(yuǎn)程認(rèn)證,接著去認(rèn)證方案中拿到默認(rèn)的認(rèn)證方案,不為空,執(zhí)行上下文的擴(kuò)展方法context.AuthenticateAsync,這個(gè)方法干了什么如下:



          ?

          ?執(zhí)行DI中注入的認(rèn)證服務(wù)方法,并傳入上下文和默認(rèn)的認(rèn)證方案名稱.





          ?


          ?先判斷存不存在默認(rèn)認(rèn)證方案,不存在拋異常,接著去所有的認(rèn)證處理器集合中拿到默認(rèn)認(rèn)證方案的處理器.接著調(diào)用處理的認(rèn)證方法,認(rèn)證成功,判斷當(dāng)前用戶身份集合中在臨時(shí)緩存中存不存在,不存在,可以執(zhí)行Claim的轉(zhuǎn)換.這很好,說(shuō)明用戶認(rèn)證成功之后的Cliam也是可以被轉(zhuǎn)換的.



          ?

          ?只要注入IClaimsTransformation服務(wù)即可,你就可以執(zhí)行你需要的業(yè)務(wù)的Claim轉(zhuǎn)換,最后返回結(jié)果



          ?到這里整個(gè)認(rèn)證流程結(jié)束.非常的簡(jiǎn)單.且關(guān)鍵點(diǎn)的擴(kuò)展微軟都預(yù)留了.可以自定義實(shí)現(xiàn)

          ?

          (2)、流轉(zhuǎn)服務(wù)的介紹.

          上面介紹了整個(gè)認(rèn)證組件的流轉(zhuǎn)過(guò)程,因?yàn)槲覍?duì)流程很清楚,所以大家可能還是不理解.所以接下去開始介紹流轉(zhuǎn)必須服務(wù)的注入.



          ?認(rèn)證處理器的Provider類,那么Core是在哪里注入認(rèn)證處理器的呢?



          ?這里,核心也是紅框里的,下面的只是一些依賴組件。



          ?微軟注入默認(rèn)的認(rèn)證處理器.看下獲取處理器的實(shí)現(xiàn),對(duì)應(yīng)中間件.

          ?

          ?閱讀源碼發(fā)現(xiàn),Provider類并不具體實(shí)現(xiàn)提供認(rèn)證處理器的方法.而是通過(guò)SchemeProvider來(lái)提供.



          ?


          原來(lái)是IAuthenticationSchemeProvider類提供認(rèn)證處理器.而且是通過(guò)反射實(shí)現(xiàn)(這點(diǎn)開銷,就沒(méi)必要考慮性能問(wèn)題,當(dāng)然你可以考慮重構(gòu)),那么問(wèn)題來(lái)了,在哪里出入IAuthenticationSchemeProvider服務(wù)內(nèi),回到上面那張圖



          ?

          ?微軟也提供了默認(rèn)實(shí)現(xiàn),去看看GetSchemeAsync方法的實(shí)現(xiàn)

          ?

          ?

          ?ok,到這里就說(shuō)明認(rèn)證處理器是通過(guò)向這個(gè)字典寫入值,來(lái)實(shí)現(xiàn)的.



          ?上面是認(rèn)證方案AuthenticationScheme類的核心字段,HandlerType就是認(rèn)證處理器.

          ?



          AuthenticationSchemeProvider類維護(hù)了一個(gè)_schemes的字典,通過(guò)它向外輸出.認(rèn)證方案集合提供類.



          ?接著認(rèn)證處理器集合提供類AuthenticationHandlerProvider通過(guò)解析



          認(rèn)證方案集合提供類,拿到所有的認(rèn)證處理器.


          到這里,很明顯,所有的認(rèn)證處理器都是通過(guò)向AuthenticationSchemeProvider的_schemes字典注入認(rèn)證處理器.既然如此,入口在哪?在AuthenticationBuilder類下面.



          ?下面是Cookie認(rèn)證方式注入認(rèn)證處理器的方式



          ?AddScmeme方法.在配置參數(shù)的同時(shí),指定了處理器.

          ?

          ?接著,回到中間件的圖




          ?我們通過(guò)AuthenticationBuilder的AddScheme方法向_schemes集合寫入了認(rèn)證處理器且配置了處理器的參數(shù),接著通過(guò)AuthenticationHandlerProvider拿到了所有的認(rèn)證處理器.

          接著我們通過(guò)Schemes方案集合拿到所有處理認(rèn)證請(qǐng)求上下文的處理器,執(zhí)行處理認(rèn)證請(qǐng)求上下文參數(shù).處理完畢.

          ?

          接著我們解析Schemes中提供的默認(rèn)認(rèn)證方案,代碼如下:





          ?根據(jù)

          ?這個(gè)配置參數(shù),一般在入口注入:




          ?中配置默認(rèn)方案名稱,拿到默認(rèn)認(rèn)證方案.再將處理過(guò)的認(rèn)證請(qǐng)求上下文和默認(rèn)方案?jìng)鹘oIAuthenticationService,這個(gè)Service也有默認(rèn)實(shí)現(xiàn),如下:



          ?


          ?AuthenticationService將處理過(guò)的認(rèn)證請(qǐng)求上下文交給具體的認(rèn)證請(qǐng)求處理器來(lái)處理.并返回處理結(jié)果.認(rèn)證請(qǐng)求處理器前面說(shuō)過(guò)了,通過(guò)AuthenticationBuilder的AddScheme方法來(lái)注入.

          到這里,整個(gè)組件的流程介紹結(jié)束.純屬個(gè)人理解,能力有限,有問(wèn)題,請(qǐng)指正,謝謝.

          下面開始介紹基于Cookie的認(rèn)證組件.

          ?

          友情鏈接
          ioDraw流程圖
          API參考文檔
          OK工具箱
          云服務(wù)器優(yōu)惠
          阿里云優(yōu)惠券
          騰訊云優(yōu)惠券
          京東云優(yōu)惠券
          站點(diǎn)信息
          問(wèn)題反饋
          郵箱:[email protected]
          QQ群:637538335
          關(guān)注微信

                人人屄 | 超碰操 | 五月婷开心综合网 | 一级无码高清 | 久久综合伊人7777777 |