百度一下”asp.net身份认证“,你会获得不少相关的资料,这些资料一般上来就会介绍诸如”Form认证“”Windows认证“等内容,而没有给出一个完整的流程。初学者对此每每一头雾水,我也曾经被坑过不少回,因而写下此文,算是复习。html
现代的Windows Server系统都是基于严格的用户机制的,当你想操做服务器时确定须要帐号密码验证的。当咱们把开发好的Web应用程序部署在服务器后,用户经过浏览器访问该站点,实际上就是该用户经过HTTP操做这台服务器的过程,本质上也是用户操做服务器(至少是读)的过程。这就产生了一个被大多数人忽略的问题:网络用户根本不知道服务器的帐号密码,怎么会有读写服务器的权限?答案能够用下面一个简单的图给出:数据库
用户发起一个请求后,受权主要经历IIS阶段和ASP.NET阶段。通过IIS时会获得系统帐号相关权限标识(或票据),使用该标识进入站点,这时asp.net运行时会把该标识转化成.NET的一个用户实体对象,咱们就能够在本身的代码中对该实体进行处理。经过一个具体的实例来认识一下,首先咱们新建一个【不进行身份认证】的MVC项目(WebForm项目亦可),为了方便描述,就叫WebAuth吧!c#
项目默认有HomeController和三个Action:Index/About/Contact。编译生成,并把它部署到iis上,为了方便我直接部署成http://localhost。就从这里开始身份认证之旅吧!浏览器
通常公司或我的开发ASP.NET的网站用的都是这种方式。好比刚刚部署的Web,咱们在IIS的功能视图中打开身份验证:安全
能够看到默认的就是匿名身份认证。这种状况下不须要任何的认证,咱们就能够访问服务器上的内容。之因此能这么方便的访问服务器的内容,是由于IIS在后台帮咱们作了不少事情。当咱们安装IIS时,安装程序会自动建立 IUSR_ComputerName 账户(其中 ComputerName 是正在运行 IIS的电脑名称),普通用户使用浏览器访问该站点时,就是直接使用这个帐号来操做服务器。咱们在开发过程当中经常碰到读写服务器某文件没有权限,这时百度一下,都会告诉你要修改IUSR_Computername用户权限,就是这个缘由。服务器
不修改任何代码。咱们在IIS中禁用”匿名身份认证“,启用”基自己份认证“,这时咱们再访问项目的项目中的时,浏览器会弹出一个对话框要求用户输入本身的用户名和密码,以下图:网络
这个帐号必须是服务器系统的帐号,且拥有对站点根目录读(写)的权限。能够在目录的文件夹属性->安全性上设置。我专门添加了个帐号test,以下:并发
返回浏览器,输入用户名test和设置的密码便可访问项目的全部页面。在不须要复杂用户逻辑的项目中使用该方法,能够不用修改任何代码实现认证。asp.net
不过基自己份认证有个很是严重的安全问题,经过这种方式的用户名和密码都以明文形式在网络间进行发送,很容易被拦截获取。并且要知道这个帐号但是服务器的帐号!能够用SSL加密来解决这个问题。ide
摘要式身份验证提供与基自己份验证相同的功能,即当用户访问http://localhost 时一样弹出输入帐号和密码的对话框。可是这种认证方式在经过网络发送用户凭据方面提升了安全性。具体流程以下:
这里特别注意一下:什么是Active Directory?它就是一个普通的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
上面四种是IIS服务器提供的验证方式,当用户经过IIS的用户验证后,就能够获得一个Windows的身份,这个身份将会被传到咱们本身的项目WebAuth中。打开工程的Web.config文件,有一项authentication配置:
<authenticationmode="Windows"/>
这里的Windows和IIS里的Windows身份认证不一样。这里指将IIS获取的Windows用户直接传到网站中使用,能够在index.cshtml中添加如下代码访问:
当前登陆状态:@Request.IsAuthenticated<br/> 当前登陆用户:@User.Identity.Name
IIS使用匿名认证之外的任何带输入框的认证,效果以下:
一般状况这种方式并没什么卵用,绝大多数状况咱们的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