上篇文章介绍了如何在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没有魔法——目录

ASP.NET没有魔法——Identity与Owin的更多相关文章

  1. ASP.NET没有魔法——ASP.NET Identity 的“多重”身份验证

    ASP.NET Identity除了提供基于Cookie的身份验证外,还提供了一些高级功能,如多次输入错误账户信息后会锁定用户禁止登录.集成第三方验证.账户的二次验证等,并且ASP.NET MVC的默 ...

  2. ASP.NET没有魔法——目录(完结)

    ASP.NET没有魔法——开篇-用VS创建一个ASP.NET Web程序 ASP.NET没有魔法——为什么使用ASP.NET ASP.NET没有魔法——第一个ASP.NET应用<MyBlog&g ...

  3. ASP.NET没有魔法——ASP.NET 身份验证与Identity

    前面的文章中为My Blog加入了文章的管理功能(ASP.NET没有魔法——ASP.NET MVC使用Area开发一个管理模块),但是管理功能应该只能由“作者”来访问,那么要如何控制用户的访问权限?也 ...

  4. ASP.NET没有魔法——ASP.NET Identity的加密与解密

    前面文章介绍了如何使用Identity在ASP.NET MVC中实现用户的注册.登录以及身份验证.这些功能都是与用户信息安全相关的功能,数据安全的重要性永远放在第一位.那么对于注册和登录功能来说要把密 ...

  5. ASP.NET没有魔法——ASP.NET Identity 的“多重”身份验证代码篇

    上篇文章介绍了ASP.NET中身份验证的机制与流程,本文将使用代码的来介绍如何实现第三方账户验证与双因子验证. 本章主要内容有: ● 实现基于微软账户的第三方身份验证 ● 实现双因子身份验证 ● 验证 ...

  6. 译:Asp.Net Identity与Owin,到底谁是谁?

    送给正在学习Asp.Net Identity的你 :-) 原文出自 trailmax 的博客AspNet Identity and Owin. Who is who. Recently I have ...

  7. ASP.NET没有魔法——ASP.NET Identity与授权

    一个完整的ASP.NET的请求中会存在身份验证(Authentication)阶段以及授权(Authorization)阶段,英文单词Authentication和Authorization非常相似, ...

  8. 【译】Asp.Net Identity与Owin,到底谁是谁?

    送给正在学习Asp.Net Identity的你 :-) 原文出自 trailmax 的博客AspNet Identity and Owin. Who is who. Recently I have ...

  9. ASP.NET没有魔法——ASP.NET MVC使用Oauth2.0实现身份验证

    随着软件的不断发展,出现了更多的身份验证使用场景,除了典型的服务器与客户端之间的身份验证外还有,如服务与服务之间的(如微服务架构).服务器与多种客户端的(如PC.移动.Web等),甚至还有需要以服务的 ...

随机推荐

  1. [01] Java语言的基本认识

    0.写在前面的话 我们都知道在计算机的底层,它是识别二进制的,也就是说,计算机只能认识0和1.这主要是因为电路的逻辑只有两种状态,所以只需要0和1两个数字就可以表示低电平和高电平.而计算机是由数不清的 ...

  2. 轻松把你的项目升级到PWA

    什么是PWA PWA(Progressive Web Apps,渐进式网页应用)是Google在2015年推出的项目,致力于通过web app获得类似native app体验的网站. 优点 1.无需客 ...

  3. ios开发——实用技术篇&三维旋转动画

    实现三位旋转动画的方法有很多种,这里介绍三种 一:UIView 1 [UIView animateWithDuration:1.0 animations:^{ 2 self.iconView.laye ...

  4. 深入浅出AQS之共享锁模式

    在了解了AQS独占锁模式以后,接下来再来看看共享锁的实现原理. 原文地址:http://www.jianshu.com/p/1161d33fc1d0 搞清楚AQS独占锁的实现原理之后,再看共享锁的实现 ...

  5. vue.js项目构建

    这里构建的vue.js项目依赖node服务器运行. 项目搭建完整步骤: 安装node.js ,转至nodeJs网站http://nodejs.cn/ 下载nodeJs进行安装. 安装完毕检查nodeJ ...

  6. 51nod 1103 N的倍数 思路:抽屉原理+前缀和

    题目: 这是一道很神奇的题目,做法非常巧妙.巧妙在题目要求n个数字,而且正好要求和为n的倍数. 思路:用sum[i]表示前i个数字的和%n.得到sum[ 1-N ]共N个数字. N个数字对N取模,每个 ...

  7. 创建 Rex-Ray volume - 每天5分钟玩转 Docker 容器技术(76)

    前面我们安装部署了 Rex-Ray,并且成功配置 VirtualBox backend,今天演示如何创建和使用 Rex-Ray volume. 在 docker1 或 docker2 上执行如下命令创 ...

  8. 使用Xshell+Xmanager远程监控jvisualvm

    使用jvisualvm的remote方式监控服务器端jvisualvm时,不是很方便,因此通过local方式,应该是正路. 一.服务器端(Linux,最小安装模式,没有图形界面) 1.安装xauth ...

  9. 支持向量机SVM(二)

    [转载请注明出处]http://www.cnblogs.com/jerrylead 6 拉格朗日对偶(Lagrange duality) 先抛开上面的二次规划问题,先来看看存在等式约束的极值问题求法, ...

  10. 用ESP8266+android,制作自己的WIFI小车(Android 软件)

    先说一下这篇文章里面的内容:TCP 客户端, 自定义对话框, 自定义按钮, ProgressBar竖直显示, 重力感应传感器,手机返回键新开启界面的问题(返回上次的界面),数据保存 软件的通信是配合 ...