ASP.NET沒有魔法——Identity與Owin

来源:http://www.cnblogs.com/selimsong/archive/2017/10/29/7743112.html
-Advertisement-
Play Games

上篇文章介紹瞭如何在ASP.NET MVC項目中引入Identity組件來實現用戶註冊、登錄及身份驗證功能,並且也提到了Identity是集成到Owin中的,本章就來介紹一下什麼是Owin以及如何使用Owin來增強Identity的功能。 本章的主要內容有: ● 什麼是Owin ● 關於Katana ...


   上篇文章介紹瞭如何在ASP.NET MVC項目中引入Identity組件來實現用戶註冊、登錄及身份驗證功能,並且也提到了Identity是集成到Owin中的,本章就來介紹一下什麼是Owin以及如何使用Owin來增強Identity的功能。

  本章的主要內容有:

  ● 什麼是Owin
  ● 關於Katana
  ● Owin與宿主IIS
  ● Owin與Identity的集成
  ● Identity在Owin中的特殊用法

什麼是Owin

  Owin(Open Web Server Interface)它是一個.NET Web伺服器和Web程式之間的介面標準,其目的是為了應用程式與伺服器解耦。為什麼需要解耦?因為ASP.NET應用(不包含ASP.NET Core和mono)都需要部署在IIS伺服器上,而通過實現Owin的介面,可以將一個控制台程式作為Web應用程式的宿主。

  Owin實質上是提供了一個名稱為環境字典的IDictionary<string, object>類型來存儲所有數據,包括請求和響應數據。在這個字典中Owin定義了一系列的核心鍵值對:

  

  另外還有一個重要的核心類型是一個參數為IDictionary<string, object>(即上面分析用於存儲數據的類型)的代理:Func<IDictionary<string, object>, Task>,每一個委托都是用於處理請求的一個獨立單元,將多個獨立單元集合到一起就形成Owin的處理管道,另外返回值是一個Task,換句話說所有的處理單元或者說中間件都需要設計成非同步的,可以提高系統的吞吐量。
  更多信息可參考文檔:http://owin.org/html/owin.html

關於Katana

  Owin既然是一個介面標準,那麼就一定有實現,微軟對Owin的實現是一個名為Katana的項目(https://github.com/aspnet/AspNetKatana),該項目中的組件大部分以Microsoft.Owin作為首碼,一下是github上部分組件目錄:

  

  Katana主要有4個部分組成,分別是宿主、伺服器、中間件和應用,如下圖整個結構是分層次的,由下到上:

  

  ● Host:也就是宿主,使用Katana可選Owin的宿主有IIS自定義宿主(如console程式)以及OwinHost.exe。前面兩個比較好理解,對於OwinHost.exe其實是Katana項目的一個用於啟動Owin應用的程式,通過命令行的方式就可以運行指定的Owin應用(註:所有的宿主都可以通過Nuget管理器安裝)。

  

 


  ● Server:伺服器,就是用來接收、響應請求的組件。
    ○ 在IIS下,通過安裝Microsoft.Owin.Host.SystemWeb,將Owin的HttpModule“動態”註冊到IIS處理管道中接收處理HTTP請求
    ○ 在自定義的宿主中,通過安裝Microsoft.Owin.Host.HttpListener,以代碼的形式顯式的根據地址和埠打開一個Soket來監聽請求。OwinHost.exe也是使用該組件來監聽請求。
  ● Middleware:中間件,實質上就是一個實現了Func<IDictionary<string, object>, Task>的委托,也可以簡單通過繼承OwinMiddleware類型來創建。創建完成後在Owin的Startup類型中通過IAppBuilder類型Use方法將其添加到管道中。
  ● Application:應用層,Owin以及Katana都沒有考慮一種新的開發應用的方式,換句話說可以沿用之前的mvc、webapi、Signalr或者是靜態頁面等方式來開發應用。

Owin與宿主IIS

  Owin在IIS的宿主(Microsoft.Owin.Host.SystemWeb)其實是一個IHttpModule的實現:

  

  而使用HttpModule對IIS的請求處理管理進行拓展的一般方法都是使用配置的方式在Web.config文件中添加。但是引入Owin後其實沒有在配置文件裡面加入任何配置,而是通過以下代碼在程式運行時註冊的:

  

  Owin在使用IIS作為宿主時就是通過HttpModule的形式對原有的ASP.NET HTTP請求通道進行了拓展,請求在ASP.NET的管道處理過程中通過HttpModule拓展的形式將整個請求轉移到Owin管道處理。

Owin與Identity的集成

  Identity就是通過Owin中間件的方式集成到處理管道中的,如下圖代碼:

  

  另外在安裝Identity的同時還在Web.config文件中加入了以下配置:

  

  刪除了Form驗證的HttpModule,這裡的原因也是identity的驗證可以代替Form驗證,所以對這個功能進行了刪除。

  運行時的HttpModule列表:

  

Identity在Owin中的特殊用法

  (註:以下代碼可以參考ASP.NET MVC預設帶有身份驗證的項目模板,部分代碼有改動DbContext名稱、命名空間以及省略了部分配置,如雙因數驗證等)

  說是特殊用法,實際上是在每一次請求時都會創建一個DbContext、UserManager以及SignInManager放在Owin的環境字典中,那麼意味著整個請求過程中都可以通過Owin獲取這些實例對用戶進行操作。

  1. 使用前準備,封裝DbContext的創建過程:

  

  2. 封裝UserManager創建過程(註:UserManager的創建中還包含了對用戶名、密碼的驗證配置以及一些驗證配置信息):

  

  3. 封裝SignInManager:

  

  SignInManager中依賴的UserManager來自Owin的上下文對象。

  另外這裡還對通過用戶信息生成身份信息做了封裝:

  

  4. 在Owin的Startup文件中加入以下代碼,確保在請求時創建這些對象:

  

  需要註意的是CreatePerOwinContext來自Identity的Owin拓展:

  

  而CreatePerOwinContext方法實際上是為Owin管道添加了一個名稱為IdentityFactoryMiddleware的Owin中間件,意思就是上面的三個方法就在Owin管道中插入了三個相同的中間件(但參數不同),以下是IdentityFactoryMiddleware調用的代碼:

  

  5. 修改Controller代碼,在實現用戶註冊、登錄功能時,從Owin的Context中獲取UserManager及SignInManager來實現:

   

  註冊方法,代碼來自預設模板(相比之前的代碼加入了對創建結果的判斷):

  

  登錄方法,代碼來自預設模板(相比之前的代碼加入了對創建結果的判斷):

  

  6. 運行效果:

  

  

  7. 安裝Identity的漢化包:

  從上面的錯誤提示中可以看到英文的提示,它們是通過在Controller中對ModelState信息添加錯誤信息,然後在View中通過Html.ValidationSummary方法顯示出來的(更多與Model相關的內容後續介紹)。

  但是由於創建用戶返回的結果信息是英文的,所以顯示也是英文,如果要把它替換成中文,那麼需要安裝漢化包:Microsoft.AspNet.Identity.Core.zh-Hans:

  

 

   安裝完成運行效果:

  

  註:用戶名密碼的驗證是在創建UserManager的時候配置的:

  

小結

  本文介紹了Owin以及ASP.NET MVC中是如何將Identity集成到Owin中並使用的,另外借鑒ASP.NET MVC模板的代碼改進了之前文章中的用戶註冊、登錄的實現。

參考:

  http://owin.org/html/spec/owin-1.0.html#1-overview
  https://msdn.microsoft.com/en-us/library/bb470252.aspx
  https://docs.microsoft.com/en-us/aspnet/aspnet/overview/owin-and-katana/owin-middleware-in-the-iis-integrated-pipeline
  http://katanaproject.codeplex.com/SourceControl/latest#src/Microsoft.Owin.Host.SystemWeb/PreApplicationStart.cs

本文鏈接:http://www.cnblogs.com/selimsong/p/7743112.html 

ASP.NET沒有魔法——目錄


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 授權chmod 777 -R /home/xueyueziyan/桌面/配置備份chmod 777 -R /home/xueyueziyan/桌面/Softwares 安裝vsftpdyum -y install vsftpd 備份cp /etc/vsftpd/vsftpd.conf /home/x ...
  • 一主板: 主板是電腦中各個部件工作的一個平臺,它把電腦的各個部件緊密的連接在一起,各個部件通過主板進行數據傳輸。 二.中央處理器(cpu) cpu,是一臺電腦的運算核心和控制中心。其主要功能是解釋電腦指令以及處理電腦軟體中的數據。cpu是整個系統中最高的執行單元,因此cpu已成為決定電腦性能的 ...
  • 1》HAProxy簡介: HAProxy是免費,高效,可靠的高可用及負載均衡解決方案,該軟體非常適合於處理高負載站點的七層數據請求,HAProxy的工作模式使其可以非常容易且安全地集成 到我們現有的站點架構中,使用類似的代理軟體還可以對外屏蔽內部的真實WEB伺服器,防止內部伺服器遭受外部攻擊;HAP ...
  • 第一次面試遇到的問題,當時完全懵逼了 網上搜到的答案: 1. 管道( pipe ):管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關係的進程間使用。進程的親緣關係通常是指父子進程關係。 2. 有名管道 (named pipe) : 有名管道也是半雙工的通信方式,但是它允許無親緣關係 ...
  • WSL,Windows Subsystem for Linux,就是之前的Bash on [Ubuntu on] Windows(嗯,微軟改名部KPI++),在wsl環境下我們可以運行一些Linux程式。 首先要說一句,其實Windows 10在一周年更新(1607,內部版本14393)的時候就加入 ...
  • NTP(Network Time Protocol,網路時間協議)是用來使網路中的各個電腦時間同步的一種協議。它的用途是把電腦的時鐘同步到世界協調時UTC,其精度在區域網內可達0.1ms,在互聯網上絕大多數的地方其精度可以達到1-50ms。 NTP伺服器就是利用NTP協議提供時間同步服務的。 系 ...
  • rpm --import http://mirrors.163.com/centos/RPM-GPG-KEY-CentOS-6 執行完成後再按照如圖所示操作 ...
  • 第一步:# vi /etc/sysconfig/network-scripts/ifcfg-bond0 DEVICE=bond0 BONDING_OPTS="mode=0 miimon=100" BOOTPROTO=none ONBOOT=yes BROADCAST=192.168.0.255 IP ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...