① 我在電腦上安裝了linux操作系統,linux的源碼應該是在系統的某個目錄下吧,請問是在哪個目錄呢謝謝
首先研究 Linux 源代碼樹的頂層目錄,它通常(但不總是)位於 /usr/src/linux-。我們不會研究得過於詳細,因為 Linux 源代碼經常會發生變化,但是,我們將嘗試讓給出的信息足以找出特定驅動程序或函數的位置。
Makefile:這個文件是整個源代碼樹的頂層 makefile。它定義了很多實用的變數和規則,比如默認的 gcc 編譯標記。
Documentation/:這個目錄中包含很多關於配置內核、運行 ramdisk 等任務的實用信息(但通常是過時的)。不過,與不同配置選項相應的幫助條目並不在這里 —— 它們在每個源代碼目錄的 Kconfig 文件中。
arch/:所有與體系結構相關的代碼都在這個目錄以及 include/asm- 目錄中。在此目錄中,每種體系結構都有自己的目錄。例如,用於基於 PowerPC 的計算機的代碼位於 arch/ppc 目錄中。在這些目錄里,可以找到底層內存管理、中斷處理、早期初始化、匯編常式,等等。
crypto/:這是內核本身所用的加密 API。
drivers/:按照慣例,在此目錄的子目錄中可以找到運行外圍設備的代碼。包括視頻驅動程序、網卡驅動程序、底層 SCSI 驅動程序,以及其他類似的驅動程序。例如,在 drivers/net 中可以找到大部分網卡驅動程序。將一類驅動程序組合在一起的某些更高層代碼,可能會(也可能不會)像底層驅動程序本身那些包含在同一目錄中。
fs/:通用文件系統的代碼(稱做 VFS,即 Virtual File System)和各個不同文件系統的代碼都可以在這個目錄中找到。ext2 文件系統是在 Linux 中最常廣泛使用的文件系統之一;在 fs/ext2 中可以找到讀取 ext2 格式的代碼。並不是所有文件系統都會編譯或運行;對某些尋找內核項目的人而言,更生僻的文件系統永遠都是理想的候選者。
include/:在 .c 文件的開頭所包含的大部分頭文件都可以在這個目錄中找到。 asm- 目錄下是與體系結構相關的包含(include )文件。部分內核構建過程創建從 asm 指定 asm- 的符號鏈接。這樣,無需將其固定編碼到 .c 文件 #include 就可以獲得用於那個體系結構的正確文件。其他目錄中包含的是 非-體系結構-相關 的頭文件。如果在不只一個 .c 文件中使用了某個結構體、常量或者變數,那麼它可能應該放入其中一個頭文件中。
init/:這個目錄中的文件包括 main.c、創建 早期用戶空間(early userspace) 的代碼,以及其他初始化代碼。可以認為 main.c 是內核「粘合劑(glue)」。在下一部分將深入討論 main.c。早期用戶空間提供了 Linux 內核引導起來時所需要的功能,而這些功能並不需要在內核本身運行。
ipc/:IPC 的意思是 進程間通信(interprocess communication)。它包含了共享內存、信號量以及其他形式 IPC 的代碼。
kernel/:不適合放在任何其他位置的通用內核級代碼位於此處。這里有高層系統調用代碼,以及 printk() 代碼、調度程序、信號處理代碼,等等。文件名包含很多信息,所以可以使用 ls kernel/,並非能常准確地猜到每個文件的功能。
lib/:這里是對所有內核代碼都通用的實用常式。常見的字元串操作、調試常式,以及命令行解析代碼都位於此處。
mm/:這個目錄中是高層次內核管理代碼。聯合使用這些常式以及底層的與體系結構相關的常式(通常位於 arch//mm/ 目錄中)來實現虛擬內存(Virtual memory,VM)。在這里會完成早期內存管理(在內存子系統完全建立起來之前需要它),以及文件的內存映射、頁高速緩存管理、內存分配、RAM 中頁的清除(還有很多其他事情)。
net/:這里是高層網路代碼。底層網路驅動程序與此層次代碼交換數據包,這個層次的代碼可以根據數據包將數據傳遞給用戶層應用程序,或者丟棄數據,或者在內核中使用它。net/core 包含大部分不同的網路協議都可以使用的代碼,和某些位於 net/ 目錄本身中的文件一樣。特定的網路協議在 net/ 的子目錄下實現。例如,在 net/ipv4 目錄中可以找到 IP(版本 4)代碼。
scripts/:這個目錄中包含的腳本可用於內核的構建,但並不將任何代碼加入到內核本身之中。例如,各種配置工具可以將它們的文件放在這里。
security/:在這里可以找到不同 Linux 安全模型的代碼,比如 NSA Security-Enhanced Linux 以及套接字和網路安全鉤子函數(hooks),以及其他安全選項。
sound/:這里放置的是音效卡驅動程序和其他與聲音相關的代碼。
usr/:此目錄中的代碼用於構建包含 root 文件系統映像的 cpio-格式 的歸檔文件,用於早期用戶空間。
② net開源項目整理
整理一些平時收藏和應用的開源代碼,方便自己學習和查閱
1.應用
nopcommerce ,開源電商網站,開發環境asp.net mvc(未支持.net core),使用技術(autofac,ef,頁面插件等)
https://github.com/nopSolutions/nopCommerce
OrchardCMS ,內容管理網站
https://github.com/OrchardCMS/Orchard(.net版本)
https://github.com/OrchardCMS/Orchard2(.net core版本)
ABP(aspnetboilerplate) ,提供一系列工具用於web應用創建,支持 ASP.NET Core, ASP.NET MVC & Web API,也提供了web應用的模板
https://github.com/aspnetboilerplate/aspnetboilerplate(.net core 版本,tag分支有支持.net版本的)
IdentityServer ,用戶授權網站(支持openid和OAuth 2.0),可用於單點登錄和第三方授權等
https://github.com/IdentityServer/IdentityServer3(.net版本)
https://github.com/IdentityServer/IdentityServer4(.net core版本)
eShopOnContainers 微軟提供的微服務實例
https://github.com/dotnet-architecture/eShopOnContainers
PetShop 三層架構經典例子,用於新手學習,不過aspx有點過時了
https://github.com/songhhwd01/PetShop
BlogEngine.NET 博客網站,也是aspx
https://github.com/rxtur/BlogEngine.NET
2.組件
Lucene.Net 全文檢索開發組件
https://github.com/apache/lucenenet
ServiceStack 半開源,用於創建web服務
https://github.com/ServiceStack/ServiceStack
MassTransit 可用於創建基於消息的服務和應用,依賴於RabbitMQ
https://github.com/MassTransit/MassTransit
stateless 簡單的工作流開發組件,不支持在線定製工作流
https://github.com/dotnet-state-machine/stateless
Hangfire 任務調度開發利器
https://github.com/HangfireIO/Hangfire
Jwt.Net 用於生成JWT (JSON Web Token) 和JWT校驗
https://github.com/jwt-dotnet/jwt
npoi 支持office文件的讀寫
https://github.com/tonyqus/npoi
StackExchange.Redis Redis的.net客戶端
https://github.com/StackExchange/StackExchange.Redis
CacheManager 用於緩存的管理,支持Redis.Memcached,couchbase等
https://github.com/MichaCo/CacheManager
Autofac Ioc組件,用於依賴注入
https://github.com/autofac/Autofac
LightGBM 用於機器學習
https://github.com/Microsoft/LightGBM
3.框架
asp.net mvc
https://github.com/aspnet/Mvc
Nancy 類似asp.net mvc,web開發框架
https://github.com/NancyFx/Nancy
4.其他
dotnet core 主頁 ,提供dotnet core相關知識的索引和例子,方便快速入門
https://github.com/dotnet/core
.net源碼
https://github.com/Microsoft/referencesource
③ .NET平台系列6 .NET Core 發展歷程
本系列技術大約30篇文章,歡迎關注、點贊、評論、轉發,每天都能獲取IT優質內容。
.NET Core 歷程
以下內容來自微軟.NET團隊:
【大約兩年前,我們開始收到一些ASP.NET客戶對於.NET 在Linux系統上的請求。在同一時期,我們開始與Windows Server Team討論關於Windows Nano,它們的未來和一些較小的服務型產品。結果,我們開始了一個新的代號為「Project K」面向新平台的.NET項目。我們沿著一條線多次更改名稱、外觀和體驗,在每次運行過程都盡量讓它更完善,適用於更多情況和更多的基礎開發人員。非常高興這個項目最終成為可用的.NET Core和ASP .NET Core 1.0。
開源代碼是這個項目另外一個重要的主題。隨著時間的推移,我們注意到所有的主流網路平台都是開源代碼。ASP.NET MVC已經開放源代碼很長時間了,但它下面的平台,.NET Framework並沒有開放源代碼。對於那些非常關心開源代碼,以及認為MVC的開源不夠全面的開發人員,我們並沒有給出回答。隨著今天的發布,ASP.NET Core是一個自上而下的開源網路平台。甚至文檔也是開源的,對於任何一個對他們的網路協議棧有開源代碼需求的人來說ASP.NET Core都是一個不錯的選擇。
我想對每個已經嘗試.NET Core和ASP.NET Core並且給我們反饋的人表示我們的感激之情。我們知道成千上萬的人已經使用過先前的1.0產品,謝謝!我們已經收到許多關於產品設計選擇,用戶體驗、性能、通信和其他主題的反饋。我們盡我們最大的努力響應了所有的反饋。有了這些反饋這次發布才能更加成功。沒有你們我們不可能完成它。謝謝!
如果你不是一名.NET開發者或者沒有應用過.NET,現在正是嘗試它的好時機。你可以在任何操作系統上、用任何工具,對於任意一個應用感受.NET沒有限制的生產力和力量。所有的開源代碼,都得力於社區和微軟的支持,查看dot.net了解.NET操作范圍。】
在我的上一篇博客《.NET平台系列5 .NET Core 簡介》中主要介紹了.NETCore的基本情況,主要包括.NET跨平台的緣由、.NET Core的定義、.NET Core的核心功能、.NET Core的包管理、.NET Core 執行的應用程序類型、.NET Core 與其他平台的關系、.NET Core 支持的操作系統、.NET Core 支持開發的應用等。微軟.NET宏偉目標到底發展的如何,首先通過下面的一幅圖可以直觀地了解。
2014年2月4日,微軟雲計算事業部副總裁 薩提亞·納德拉 出任微軟第三任CEO,改變微軟企業文化,開始開源、擁抱Linux。2015年微軟對.NET平台進行了重新設計與架構。
2016年6月27日,.NET Core1.0 項目正式發布,徹底改變了 Windows Only 的場景,擁抱開源。同時也得到了全世界開發者的喜愛與支持,很多頂級大牛為.NET Core貢獻代碼,發展非常迅速,順勢推出了.NET Core1.1、.NET Core2.0、.NET Core2.1、.NET Core2.2、.NET Core3.0、.NET Core 3.1、.NET5,最新推出.NET 6預覽版,預計到2021年11月,正式發布.NET6。
.NET Core 版本支持
從微軟官網 https://dotnet.microsoft.com/download/dotnet 可以了解到,.NET團隊到2021年8月21日將停止支持.NET Core 2.1 版本、到2022年12月3日將停止支持.NET Core 3.1版本。.NET5.0 是目前微軟推薦的可用於生產環境的最新版本,.NET6.0目前處於預覽版本,個人學習可以使用,不建議用到生產環境,待6.0正式版發布後,基於.NET Core 3.1 或者 .NET 5.0的項目可以無縫遷移到.NET 6.0。
本系列技術大約30篇文章,歡迎關注、點贊、評論、轉發,每天都能獲取IT優質內容。
#國際體操協會解釋橋本大輝跳馬打分#
#南京、張家界或形成疫情傳播雙中心#
#劉德華抖音看播人數破億#
#黃曉明祝賀表妹陳夢獲女乒冠軍#
#南京疫情已蔓延至15省27市#
④ 通俗易懂,什麼是.NET Core以及.NET Core能做什麼
我們都知道.NET Core是一個可以用來構建現代、可伸縮和高性能的跨平台軟體應用程序的通用開發框架。可用於為Windows、Linux和MacOS構建軟體應用程序。與其他軟體框架不同,.NET Core是最通用的框架,可用於構建各種軟體,包括Web應用程序、移動應用程序、桌面應用程序、雲服務、微服務、API、 游戲 和物聯網應用程序。與其他框架不同,.NET Core並不局限於單一的編程語言,它支持C#、VB.NET、F#、XAML和TypeScript。這些編程語言都是開源的,由獨立的社區管理。
.NET Core提供了最先進、最成熟和最廣泛的類庫、公共API、多語言支持和工具。藉助於Visual Studio 2019和Visual Studio Code 這些最先進和最現代的開發工具,使得.NET Core成為開發人員最高效的平台之一。
.NET Core的 歷史
.NET Core是由Microsoft開發,目前在.NET Foundation(一個非營利的開源組織)下進行管理。.NET Core是用C#和C++編寫的,並採用MIT協議作為開源協議。第一個版本的.NET Core 1.0是在2016年發布的,功能有限。NET Core 2.0於2017年8月14日發布。在這個版本中發布的兩個核心框架是ASP.NET Core2.0和 Entity Framework Core 2.0。下一個穩定版本.NET Core 2.1和2.2於2018年5月和12月發布。.NET Core的當前版本為3.0.0,並且在2019年5月6日發布了第5個預覽版。
下表總結了.NET Core的主要里程碑:
版本發布日期關鍵特徵/產品.NET Core 1.06/27/2016VisualStudio 2015 Update 3支持的.NET Core的初始版本。.net Core 1.1.13/7/2017.NET Core Tools 1.0受VisualStudio 2017支持.NET Core 2.08/14/2017VisualStudio 2017 15.3,ASP.NETCore 2.0,實體框架2.0.NET Core 2.15/30/2018ASP.NET Core 2.1,EF Core 2.1.NET Core 2.212/4/2018ASP.NET Core 2.2,EF Core 2.2.NET Core 3.0預覽33/6/2019通過VisualStudio2019支持ASP.NET Core 3.0、EF Core3.0、UWP、Windows窗體、WPF。
.NET Core的特點
.NET Core的主要特性包括開源、跨平台、現代、靈活、輕量級、快速、友好、可共享,以及為未來的軟體開發而構建的。
.NET Core是免費和開源的
.NET Core平台是免費的、開源的。.NET Core的源代碼託管在Github上。任何開發人員都可以參與到.NET Core的開發。有數千名參與.NET Core開發的活躍開發人員正在改進特性、添加新特性以及修復bug和問題。
.NET Core由一個名為.NET Foundation的獨立的非營利組織管理。60,000多名開發人員和3,700多家公司正在為.NET生態系統做出貢獻。
.NET Core是免費的,並且採用MIT和Apache協議作為開源協議。對商業十分友好。不像某Java
.NET Core是跨平台的
.NET Core支持並運行在Windows、MacOS和Linux操作系統上。.NET Core跨體系結構(包括x64、x86和ARM)是一致的。可以導入相同的程序集和庫,並在多個平台上使用。這些程序集和庫都可以使用如下的.NET語言進行構建,如:C#、VB.NET或F#。
.NET Core是可共享的
.NET Core使用一種用.NET Standard編寫的一致API模型,這種模型對所有.NET應用程序都是通用的。相同的API或庫可以與多種語言的多個平台一起使用。
.NET Core是現代的
與一些較舊的框架不同,.NET Core旨在解決當今的現代需求,包括移動友好、構建一次在任何地方運行、可伸縮和高性能。.NET Core旨在構建針對各種設備的應用程序,包括物聯網和 游戲 機。
Visual Studio 2019和Visual Studio Code是世界上最先進和最現代的集成開發環境。這兩個IDES都支持當今的現代需求,並且專注於干凈、速度和生產力。在這里了解有關VisualStudio 2019功能的更多信息:VisualStudio 2019新特性.
.NET Core是快速的
.NET Core 3.0 是快速的。與.NET Framework和.NET Core 2.2及以前的版本相比,.NET Core 3.0的速度很快。.NET Core比其他伺服器端框架(如Java Servlet和Node.js)快得多。
根據TechEmpowers發布的一份報告,.NET Core比任何其他框架都要快得多。 TechEmpower基準測試通過對多個Web應用程序框架做如下比較:資料庫的單表查詢,多表查詢,文件訪問,數據更新,明文和JSON序列化等任務進行比較。
.NET Core是輕量級的
.NET Core是輕量級的。.NET Core可以包含在您的應用程序中,也可以安裝在並行用戶、機器范圍內或伺服器上。.NET Core可以部署在Docker容器中。
.NET Core是友好的
.NET Core通過.NET Standard與.NET Framework,Xamarin和Mono兼容。 .NET Core還支持使用各種流行的Web框架和庫,如React,Angular和JavaScript。 TypeScript是.NET Core和Visual Studio生態系統的關鍵組件之一。
我們可以使用.NET Core構建哪些類型的應用程序?
.NET Core是一個通用的軟體開發框架。它允許開發人員構建各種軟體,包括Web,桌面,移動,雲, 游戲 ,物聯網等。
.NET Core更適合跨平台需求。.NET Core應用程序支持在Windows,Linux和macOS上運行。Linux和macOS上也都支持Microsoft流行的開源代碼編輯器Visual Studio Code。VS Code支持代碼編輯器的現代需求,包括智能提醒和調試。大多數第三方編輯器(如Sublime,Emacs和VI)都支持.NET Core。
Web應用
ASP.NET Core是.NET Core生態系統的核心組件。ASP.NET Core是一個用於構建網頁的框架。ASP.NET Core基於MVC架構,並提供用於構建Web的通用庫。開始使用ASP.NET Core
Razor是一個使用C#和TypeScript構建動態網頁的新框架。Razor是一種改變 游戲 規則的技術,它允許C#開發人員用C#構建Web應用程序。
移動開發
移動開發是.NET Core的關鍵產品。Xamarin是一套使用C#構建跨平台移動應用程序的工具和庫。Xamarin允許開發人員在共享的.NET代碼庫上為IOS、Android、Windows和MacOS構建本地應用程序。
桌面應用程序
.NET Core提供各種框架和工具來構建桌面應用程序。Windows窗體、WPF、UWP和Xamarin是構建桌面應用程序的四個主要框架。.NET Core還支持這些框架之間的互操作性。
Windows窗體是一種構建Windows桌面應用程序的技術。Windows窗體是.NET Framework的首批組件之一。
WPF(Windows Presentation Foundation)是一種較新的構建Windows桌面應用程序的技術。WPF是作為.NET Framework版本的一部分發布的
了解有關wpf的更多信息這里.
UWP是一種較新的技術,是在Windows 8之後發布的。如今,UWP已經成熟。UWP使用XAML作為表示層(UI)和C#作為後端編程。但是,貌似微軟已經宣布了他的死亡。
微服務和容器
微服務是一種新的設計模式,它允許開發人員構建軟體服務的小模塊,這些模塊可以使用定義良好的契約相互通信。微服務使開發、測試和部署應用程序的獨立部分更加容易。一旦部署完畢,每個微服務都可以根據需要獨立地進行縮放。.NET Core支持微服務體系結構,它允許跨平台服務與.NET Core一起工作,包括使用.NET Framework、Java、Ruby或其他開發的服務。
容器是今天的越野車。.NET Core的模塊化、輕量級和靈活性使得將.NET Core應用程序部署到容器中變得更加容易。容器把一個應用程序的所有的配置文件和依賴關系,包含在一個單獨的、小型的和獨立的軟體部署單元中。容器可以部署在任何平台、雲、Linux和Windows上。.NET Core與Docker和Azure Kubernetes服務都很好地協作。
雲應用程序
雲應用程序現在越來越受歡迎。Azure支持各種雲應用程序。.NET Core和C#應用程序可以通過Visual Studio 2019部署在Azure上。
物聯網
物聯網應用正在增長。.NET Core支持通過UWP框架為運行Windows 10 IoT Core的物聯網設備進行物聯網開發。UWP可用於構建在由Raspberry Pi,MinnowBoard MAX,DragonBoard 410c等提供支持的物聯網上運行的應用程序。
機器學習
機器學習是軟體開發人員日益增長的領域。
參考微軟官方文檔
游戲
Unity是最受歡迎的 游戲 開發框架之一。C#和UWP用於構建移動,桌面,控制台,電視,VR,AR和Web 游戲 。
.NET Core 3.0中的新增的功能有哪些?
最新版本的.NET Core 3.0剛剛發布。C#8和Windows桌面是這個版本的兩個主要新增部分。
C#8是C#語言的最新版本。C#8是.NET Core的一部分。C#8增加了新功能,包括
Windows桌面是.NET Core 3.0的新增功能,允許開發人員使用Windows窗體,WPF和UWP構建Windows桌面應用程序。
以下是.NET Core 3.0中的其他功能和增強功能列表,
參考文獻
⑤ netcore是什麼
netcore意思:
.NET Core是一個開源通用的開發框架,支持跨平台,即支持在Window,macOS,Linux等系統上的開發和部署,並且可以在硬體設備,雲服務,和嵌入式/物聯網方案中進行使用。.NET Core的源碼放在GitHub上,由微軟官方和社區共同支持。
它和傳統的.NET Framework,屬於「子集—超集」的關系,或者你也可以簡單地認為它就是.NET Framework的跨平台版本(基於BCL的層面上看)。這是因為在當前版本中(1.0),.NET Core中的大部分核心代碼都是從.NET Framework中繼承重寫的,包括Runtime和Libraries(如GC, JIT, 部分類型)。
netcore-深圳市磊科實業有限公司,是國際知名專業的網路通訊製作商,主要產品涉及家用無線路由器、企業級路由器、無線網卡、交換機、二三四層交換機及無線組網設備。
net,網路,core,核心。netcore,泛指網路核心(技術、應用)。
⑥ ASP.NET Core認證原理和實現
通常在應用程序中,安全分為前後兩個步驟:驗證和授權。驗證負責檢查當前請求者的身份,而授權則根據上一步得到的身份決定當前請求者是否能夠訪問期望的資源。
既然安全從驗證開始,我們也就從驗證開始介紹安全。
我們先從比較簡單的場景開始考慮,例如在 Web API 開發中,需要驗證請求方是否提供了安全令牌,安全令牌是否有效。如果無效,那麼 API 端應該拒絕提供服務。在命名空間 Microsoft.AspNetCore.Authentication 下,定義關於驗證的核心介面。對應的程序集是 Microsoft.AspNetCore.Authentication.Abstractions.dll。
在 ASP.NET 下,驗證中包含 3 個基本操作:
驗證操作負責基於當前請求的上下文,使用來自請求中的信息,例如請求頭、Cookie 等等來構造用戶標識。構建的結果是一個 AuthenticateResult 對象,它指示了驗證是否成功,如果成功的話,用戶標識將可以在驗證票據中找到。
常見的驗證包括:
在授權管理階段,如果用戶沒有得到驗證,但所期望訪問的資源要求必須得到驗證的時候,授權服務會發出質詢。例如,當匿名用戶訪問受限資源的時候,或者當用戶點擊登錄鏈接的時候。授權服務會通過質詢來相應用戶。
例如
質詢操作應該讓用戶知道應該使用何種驗證機制來訪問請求的資源。
在授權管理階段,如果用戶已經通過了驗證,但是對於其訪問的資源並沒有得到許可,此時會使用拒絕操作。
例如:
拒絕訪問處理應該讓用戶知道:
在這個場景下,可以看到,驗證需要提供的基本功能就包括了驗證和驗證失敗後的拒絕服務兩個操作。在 ASP.NET Core 中,驗證被稱為 Authenticate,拒絕被稱為 Forbid。 在供消費者訪問的網站上,如果我們希望在驗證失敗後,不是像 API 一樣直接返回一個錯誤頁面,而是將用戶導航到登錄頁面,那麼,就還需要增加一個操作,這個操作的本質是希望用戶再次提供安全憑據,在 ASP.NET Core 中,這個操作被稱為 Challenge。這 3 個操作結合在一起,就是驗證最基本的要求,以介面形式表示,就是 IAuthenticationHandler 介面,如下所示:
驗證的結果是一個 AuthenticateResult 對象。值得注意的是,它還提供了一個靜態方法 NoResult() 用來返回沒有得到結果,靜態方法 Fail() 生成一個表示驗證異常的結果,而 Success() 成功則需要提供驗證票據。
通過驗證之後,會返回一個包含了請求者票據的驗證結果。
在 GitHub 中查看 AuthenticateResult 源碼
那麼驗證的信息來自哪裡呢?除了前面介紹的 3 個操作之外,還要求一個初始化的操作 Initialize,通過這個方法來提供當前請求的上下文信息。
在 GitHub 中查看 IAuthenticationHandler 定義
有的時候,我們還希望提供登出操作,增加登出操作的介面被稱為 IAuthenticationSignOutHandler。
在 GitHub 中查看 IAuthenticationSignOutHandler 源碼
在登出的基礎上,如果還希望提供登錄操作,那麼就是 IAuthenticationSignInHandler 介面。
在 GitHub 中查看 IAuthenticationSignInHandler 源碼
直接實現介面還是比較麻煩的,在命名空間 Microsoft.AspNetCore.Authentication 下,微軟提供了抽象基類 AuthenticationHandler 以方便驗證控制器的開發,其它控制器可以從該控制器派生,以取得其提供的服務。
通過類的定義可以看到,它使用了泛型。每個控制器應該有一個對應該控制器的配置選項,通過泛型來指定驗證處理器所使用的配置類型,在構造函數中,可以看到它被用於獲取對應的配置選項對象。
在 GitHub 中查看 AuthenticationHandler 源碼
通過 InitializeAsync(),驗證處理器可以獲得當前請求的上下文對象 HttpContext。
最終,作為抽象類的 ,希望派生類來完成這個驗證任務,抽象方法 HandleAuthenticateAsync() 提供了擴展點。
驗證的結果是一個 AuthenticateResult。
而拒絕服務則簡單的多,直接在這個抽象基類中提供了默認實現。直接返回 HTTP 403。
剩下的一個也一樣,提供了默認實現。直接返回 HTTP 401 響應。
對於 JWT 來說,並不涉及到登入和登出,所以它需要從實現 IAuthenticationHandler 介面的抽象基類 AuthenticationHandler 派生出來即可。從 AuthenticationHandler 派生出來的 JwtBearerHandler 實現基於自己的配置選項 JwtBearerOptions。所以該類定義就變得如下所示,而構造函數顯然配合了抽象基類的要求。
在 GitHub 中查看 JwtBearerHandler 源碼
真正的驗證則在 HandleAuthenticateAsync() 中實現。下面的代碼是不是就很熟悉了,從請求頭中獲取附帶的 JWT 訪問令牌,然後驗證該令牌的有效性,核心代碼如下所示。
在 GitHub 中查看 JwtBearerHandler 源碼
在 ASP.NET Core 中,你可以使用各種驗證處理器,並不僅僅只能使用一個,驗證控制器需要一個名稱,它被看作該驗證模式 Schema 的名稱。Jwt 驗證模式的默認名稱就是 "Bearer",通過字元串常量 JwtBearerDefaults.AuthenticationScheme 定義。
在 GitHub 中查看 JwtBearerDefaults 源碼
最終通過 AuthenticationBuilder 的擴展方法 AddJwtBearer() 將 Jwt 驗證控制器注冊到依賴注入的容器中。
在 GitHub 中查看 JwtBearerExtensions 擴展方法源碼
一種驗證處理器,加上對應的驗證配置選項,我們再為它起一個名字,組合起來就成為一種驗證架構 Schema。在 ASP.NET Core 中,可以注冊多種驗證架構。例如,授權策略可以使用架構的名稱來指定所使用的驗證架構來使用特定的驗證方式。在配置驗證的時候,通常設置默認的驗證架構。當沒有指定驗證架構的時候,就會使用默認架構進行處理。
還可以
注冊的驗證模式,最終變成 AuthenticationScheme,注冊到依賴注入服務中。
在 GitHub 中查看 AuthenticationScheme 源碼
各種驗證架構被保存到一個 IAuthenticationSchemeProvider 中。
在 GitHub 中查看 IAuthenticationSchemeProvider 源碼
最終的使用是通過 來實現的,通過一個驗證模式的字元串名稱,可以取得所對應的驗證控制器。
在 GitHub 中查看 源碼
它的默認實現是 AuthenticationHandlerProvider,源碼並不復雜。
在 GitHub 中查看 AuthenticationHandlerProvider 源碼
驗證中間件的處理就沒有那麼復雜了。
找到默認的驗證模式,使用默認驗證模式的名稱取得對應的驗證處理器,如果驗證成功的話,把當前請求用戶的主體放到當前請求上下文的 User 上。
裡面還有一段特別的代碼,用來找出哪些驗證處理器實現了 ,並依次調用它們,看看是否需要提取終止請求處理過程。
在 GitHub 中查看 AuthenticationMiddle 源碼