ASP.NET没有魔法——Identity与Owin
2021-05-03 09:28
标签:obj 参考 config system 中文 中间 静态 cat ext 上篇文章介绍了如何在ASP.NET MVC项目中引入Identity组件来实现用户注册、登录及身份验证功能,并且也提到了Identity是集成到Owin中的,本章就来介绍一下什么是Owin以及如何使用Owin来增强Identity的功能。 本章的主要内容有: ● 什么是Owin Owin(Open Web Server Interface)它是一个.NET Web服务器和Web程序之间的接口标准,其目的是为了应用程序与服务器解耦。为什么需要解耦?因为ASP.NET应用(不包含ASP.NET Core和mono)都需要部署在IIS服务器上,而通过实现Owin的接口,可以将一个控制台程序作为Web应用程序的宿主。 Owin实质上是提供了一个名称为环境字典的IDictionary 另外还有一个重要的核心类型是一个参数为IDictionary 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管理器安装)。 Owin在IIS的宿主(Microsoft.Owin.Host.SystemWeb)其实是一个IHttpModule的实现: 而使用HttpModule对IIS的请求处理管理进行拓展的一般方法都是使用配置的方式在Web.config文件中添加。但是引入Owin后其实没有在配置文件里面加入任何配置,而是通过以下代码在程序运行时注册的: Owin在使用IIS作为宿主时就是通过HttpModule的形式对原有的ASP.NET HTTP请求通道进行了拓展,请求在ASP.NET的管道处理过程中通过HttpModule拓展的形式将整个请求转移到Owin管道处理。 Identity就是通过Owin中间件的方式集成到处理管道中的,如下图代码: 另外在安装Identity的同时还在Web.config文件中加入了以下配置: 删除了Form验证的HttpModule,这里的原因也是identity的验证可以代替Form验证,所以对这个功能进行了删除。 运行时的HttpModule列表: (注:以下代码可以参考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 本文链接:http://www.cnblogs.com/selimsong/p/7743112.html ASP.NET没有魔法——目录 ASP.NET没有魔法——Identity与Owin 标签:obj 参考 config system 中文 中间 静态 cat ext 原文地址:http://www.cnblogs.com/selimsong/p/7743112.html
● 关于Katana
● Owin与宿主IIS
● Owin与Identity的集成
● Identity在Owin中的特殊用法什么是Owin
更多信息可参考文档:http://owin.org/html/owin.html关于Katana
● Server:服务器,就是用来接收、响应请求的组件。
○ 在IIS下,通过安装Microsoft.Owin.Host.SystemWeb,将Owin的HttpModule“动态”注册到IIS处理管道中接收处理HTTP请求。
○ 在自定义的宿主中,通过安装Microsoft.Owin.Host.HttpListener,以代码的形式显式的根据地址和端口打开一个Soket来监听请求。OwinHost.exe也是使用该组件来监听请求。
● Middleware:中间件,实质上就是一个实现了Func
● Application:应用层,Owin以及Katana都没有考虑一种新的开发应用的方式,换句话说可以沿用之前的mvc、webapi、Signalr或者是静态页面等方式来开发应用。Owin与宿主IIS
Owin与Identity的集成
Identity在Owin中的特殊用法
小结
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
文章标题:ASP.NET没有魔法——Identity与Owin
文章链接:http://soscw.com/index.php/essay/81744.html