上篇文章介绍了如安在ASP.NET MVC项目中引入Identity组件来实现用户注册、登录及身份验证成果,并且也提到了Identity是集成到Owin中的,本章就来介绍一下什么是Owin以及如何使用Owin来增强Identity的成果。
本章的主要内容有:
● 什么是Owin
● 关于Katana
● Owin与宿主IIS
● Owin与Identity的集成
● Identity在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,换句话说所有的措置惩罚惩罚单元或者说中间件都需要设计成异步的,可以提高系统的吞吐量。
更多信息可参考文档:
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的宿主(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名称、定名空间以及省略了部分配置,如双因子验证等)