.NET Web的身份认证

    百度一下”asp.net身份认证“,你会获得不少相关的资料,这些资料一般上来就会介绍诸如”Form认证“”Windows认证“等内容,而没有给出一个完整的流程。初学者对此每每一头雾水,我也曾经被坑过不少回,因而写下此文,算是复习。html

    现代的Windows Server系统都是基于严格的用户机制的,当你想操做服务器时确定须要帐号密码验证的。当咱们把开发好的Web应用程序部署在服务器后,用户经过浏览器访问该站点,实际上就是该用户经过HTTP操做这台服务器的过程,本质上也是用户操做服务器(至少是读)的过程。这就产生了一个被大多数人忽略的问题:网络用户根本不知道服务器的帐号密码,怎么会有读写服务器的权限?答案能够用下面一个简单的图给出:数据库

              

  1 

         用户发起一个请求后,受权主要经历IIS阶段和ASP.NET阶段。通过IIS时会获得系统帐号相关权限标识(或票据),使用该标识进入站点,这时asp.net运行时会把该标识转化成.NET的一个用户实体对象,咱们就能够在本身的代码中对该实体进行处理。经过一个具体的实例来认识一下,首先咱们新建一个【不进行身份认证】的MVC项目(WebForm项目亦可),为了方便描述,就叫WebAuth吧!c#

1

        项目默认有HomeController和三个Action:Index/About/Contact。编译生成,并把它部署到iis上,为了方便我直接部署成http://localhost。就从这里开始身份认证之旅吧!浏览器

IIS阶段

1、匿名身份认证

        通常公司或我的开发ASP.NET的网站用的都是这种方式。好比刚刚部署的Web,咱们在IIS的功能视图中打开身份验证:安全

2

        能够看到默认的就是匿名身份认证。这种状况下不须要任何的认证,咱们就能够访问服务器上的内容。之因此能这么方便的访问服务器的内容,是由于IIS在后台帮咱们作了不少事情。当咱们安装IIS时,安装程序会自动建立 IUSR_ComputerName 账户(其中 ComputerName 是正在运行 IIS的电脑名称),普通用户使用浏览器访问该站点时,就是直接使用这个帐号来操做服务器。咱们在开发过程当中经常碰到读写服务器某文件没有权限,这时百度一下,都会告诉你要修改IUSR_Computername用户权限,就是这个缘由。服务器

2、基自己份认证

        不修改任何代码。咱们在IIS中禁用”匿名身份认证“,启用”基自己份认证“,这时咱们再访问项目的项目中的时,浏览器会弹出一个对话框要求用户输入本身的用户名和密码,以下图:网络

2

        这个帐号必须是服务器系统的帐号,且拥有对站点根目录读(写)的权限。能够在目录的文件夹属性->安全性上设置。我专门添加了个帐号test,以下:并发

3

        返回浏览器,输入用户名test和设置的密码便可访问项目的全部页面。在不须要复杂用户逻辑的项目中使用该方法,能够不用修改任何代码实现认证。asp.net

        不过基自己份认证有个很是严重的安全问题,经过这种方式的用户名和密码都以明文形式在网络间进行发送,很容易被拦截获取。并且要知道这个帐号但是服务器的帐号!能够用SSL加密来解决这个问题。ide

3、摘要式身份认证

        摘要式身份验证提供与基自己份验证相同的功能,即当用户访问http://localhost 时一样弹出输入帐号和密码的对话框。可是这种认证方式在经过网络发送用户凭据方面提升了安全性。具体流程以下:

4

  1. 客户从运行 IIS 的服务器请求文件。
  2. IIS 拒绝请求,告诉给客户端正在使用摘要式身份验证,并发送领域名称。
  3. Internet Explorer 提示用户输入凭据(用户名和密码)。而后,Internet Explorer 合并这些凭据和领域名称以建立一个 MD5 哈希,并从运行 IIS 的服务器从新提交文件请求,此时发送的是 MD5 哈希。
  4. 运行 IIS 的服务器接收哈希,并将客户端的哈希发送到域控制器以进行验证。
  5. 域控制器向运行 IIS 的服务器通知验证结果。
  6. 若是客户端已通过身份验证,则 IIS 将请求的文档或数据发送到客户端。

这里特别注意一下:什么是Active Directory?它就是一个普通的Windows服务,经过数据库把系统的网络对象信息存储起来,好比系统的帐号,用户组,共享资源等。能够方便使用者方便的查找和使用这些信息。

四 Windows身份认证

        同上,这种认证方式对于客户端用户来讲和基本认证并无什么区别,但实际上它比基本认证要复杂的多。这种方式在经过网络发送用户名和密码以前,先将它们进行哈希计算。当启用集成 Windows 身份验证时,用户的浏览器经过与 Web 服务器进行密码交换(包括哈希)来证实其知晓密码。集成 Windows 身份验证是 Windows Server 2003 家族成员中使用的默认验证方法。

        Windows 身份认证主要有两种方式:NTLM 方式和Kerberos V5。若是在 Windows 2000 或更高版本域控制器上安装了 Active Directory 服务,而且用户的浏览器支持 Kerberos v5 验证协议,则使用 Kerberos v5 验证,不然使用 NTLM 验证。这两种方式的详细讲解可参考A大的这篇文章:http://www.cnblogs.com/artech/archive/2011/01/24/kerberos.html

asp.net阶段

       上面四种是IIS服务器提供的验证方式,当用户经过IIS的用户验证后,就能够获得一个Windows的身份,这个身份将会被传到咱们本身的项目WebAuth中。打开工程的Web.config文件,有一项authentication配置:

<authenticationmode="Windows"/>

        这里的Windows和IIS里的Windows身份认证不一样。这里指将IIS获取的Windows用户直接传到网站中使用,能够在index.cshtml中添加如下代码访问:

当前登陆状态:@Request.IsAuthenticated<br/>
当前登陆用户:@User.Identity.Name

        IIS使用匿名认证之外的任何带输入框的认证,效果以下:

_3

        一般状况这种方式并没什么卵用,绝大多数状况咱们的IIS都只用“匿名身份认证”方式。而后在本身的站点里开发本身的用户逻辑,将authentication的mode设置为forms,即咱们耳熟能详的Form认证。

        Form认证的核心原理很简单,用户在请求信息中携带本身的身份证实(用户名&密码),站点验证经过后,向用户颁发一张证实身份的票据,客户端经过Cookie的方式来存储这个票据,在之后的请求中,经过在请求中附带票据来证实身份。园子里有位大神经过以系列的实例讲的很是清楚:http://www.cnblogs.com/fish-li/archive/2012/04/15/2450571.html,微软官方为Form认证提供了全方位的支持与扩展----Membership及Identity!关于这两种方式,腾飞兄在他的博客里面讲解的也很是详细:http://www.cnblogs.com/jesse2013/p/membership.html 及 http://www.cnblogs.com/jesse2013/p/aspnet-identity-claims-based-authentication-and-owin.html

相关文章
相关标签/搜索