網站首頁 編程語言 正文
今天我們來探索一下ASP.NET Core中關于權限認證,所謂權限認證,就是通過某些方式獲取到用戶的信息。
需要開啟權限認證,我們首先需要在容器中注入認證服務,使用services.AddAuthentication。進入該方法的源碼,最重要的其實就是AddAuthenticationCore方法,他向容器中注入了認證體系中很重要的對象:IAuthenticationService、IAuthenticationHandlerProvider、IAuthenticationSchemeProvider
public static IServiceCollection AddAuthenticationCore(this IServiceCollection services) { if (services == null) { throw new ArgumentNullException(nameof(services)); } services.TryAddScoped(); services.TryAddSingleton (); // Can be replaced with scoped ones that use DbContext services.TryAddScoped (); services.TryAddSingleton (); return services; }
然后還需要在Configure管道處理中加上需要權限認證app.UseAuthentication(),該方法會向處理管道中添加名為AuthenticationMiddleware的中間件,具體一個請求到來時,框架是如何進行權限認證的處理邏輯都在這里。
下面我們就大致討論一下AuthenticationMiddleware中間件中對于權限認證過程的細節:
1、請求進入認證環節,首先會進入IAuthenticationSchemeProvider對象拿到AuthenticationOptions對象中的IList
2、通過循環集合,調用AuthenticationSchemeBuilder對象的Builder方法去獲得所有的認證方案AuthenticationScheme,將得到的AuthenticationScheme以AuthenticationScheme.Name作為key保存到AuthenticationSchemeProvider對象的字典集合IDictionary
3、拿到了AuthenticationScheme對象,其認證處理類型即可在HandlerType屬性中得到,然后在IAuthenticationHandlerProvider的實例對象中根據HandlerType創建一個認證處理對象IAuthenticationHandler,最后調用該對象的AuthenticateAsync方法就是完成具體的認證處理邏輯。需要注意的是這里的IAuthenticationHandler對象會根據每個AuthenticationScheme具備的認證處理邏輯而來,所以得到的AuthenticationScheme不同,認證處理的邏輯就不同。
下圖是我針對認證流程畫的一個的大致過程:
?以上就是用戶認證體系中大致認證邏輯,當然通過以上的描述還會存在以下疑點:
1、進入認證環節后,AuthenticationSchemeProvider可能會擁有很多個AuthenticationScheme,需要通過傳入某個認證方案名稱來拿到具體的AuthenticationScheme,那么這個傳入的動作是在哪里呢?
2、AuthenticationSchemeProvider對象在實例化的時候從AuthenticationOptions對象中獲取IList
3、如何在認證體系中添加需要的AuthenticationScheme呢?
以Cookie為例,我們會在向容器添加認證服務的時候就會指定默認的認證方案名稱:service.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme),方法返回AuthenticationBuilder,但此刻還只是組建了認證服務的框架,還需要向這個框架中添加處理認證的方案,所以會通過AuthenticationBuilder.AddCookie將Cooike的認證方案添加進來,當然我們可以添加很多個方案,比如使用JWT進行認證,但實際認證過程還是根據傳遞的默認方案的名稱進行的。
原文鏈接:https://www.cnblogs.com/XFlyMan/p/16008208.html
相關推薦
- 2022-03-26 C語言二叉樹的遍歷示例介紹_C 語言
- 2023-01-03 python中import和from-import的區別解析_python
- 2022-10-07 Go語言設計模式之實現觀察者模式解決代碼臃腫_Golang
- 2022-05-22 Python學習之os包使用教程詳解_python
- 2022-04-10 Blazor頁面組件用法介紹_基礎應用
- 2022-09-06 python使用seaborn繪圖直方圖displot,密度圖,散點圖_python
- 2022-04-24 Postman設置環境變量的實現示例_相關技巧
- 2022-08-18 C++詳解如何實現動態數組_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支