.NET Web的身份认证
百度一下”asp.net身份认证“,你会得到很多相关的资料,这些资料通常上来就会介绍诸如”Form认证“”Windows认证“等内容,而没有给出一个完整的流程。初学者对此往往一头雾水,我也曾经被坑过很多回,于是写下此文,算是复习。
现代的Windows Server系统都是基于严格的用户机制的,当你想操作服务器时肯定需要账号密码验证的。当我们把开发好的Web应用程序部署在服务器后,用户通过浏览器访问该站点,实际上就是该用户通过HTTP操作这台服务器的过程,本质上也是用户操作服务器(至少是读)的过程。这就产生了一个被大多数人忽略的问题:网络用户根本不知道服务器的账号密码,怎么会有读写服务器的权限?答案可以用下面一个简单的图给出:

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

项目默认有HomeController和三个Action:Index/About/Contact。编译生成,并把它部署到iis上,为了方便我直接部署成http://localhost。就从这里开始身份认证之旅吧!
IIS阶段
一、匿名身份认证
一般公司或个人开发ASP.NET的网站用的都是这种方式。比如刚刚部署的Web,我们在IIS的功能视图中打开身份验证:

可以看到默认的就是匿名身份认证。这种情况下不需要任何的认证,我们就可以访问服务器上的内容。之所以能这么方便的访问服务器的内容,是因为IIS在后台帮我们做了很多事情。当我们安装IIS时,安装程序会自动创建 IUSR_ComputerName 帐户(其中 ComputerName 是正在运行 IIS的电脑名称),普通用户使用浏览器访问该站点时,就是直接使用这个账号来操作服务器。我们在开发过程中常常碰到读写服务器某文件没有权限,这时百度一下,都会告诉你要修改IUSR_Computername用户权限,就是这个原因。
二、基本身份认证
不修改任何代码。我们在IIS中禁用”匿名身份认证“,启用”基本身份认证“,这时我们再访问项目的项目中的时,浏览器会弹出一个对话框要求用户输入自己的用户名和密码,如下图:

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

返回浏览器,输入用户名test和设置的密码即可访问项目的所有页面。在不需要复杂用户逻辑的项目中使用该方法,可以不用修改任何代码实现认证。
不过基本身份认证有个非常严重的安全问题,通过这种方式的用户名和密码都以明文形式在网络间进行发送,很容易被拦截获取。而且要知道这个账号可是服务器的账号!可以用SSL加密来解决这个问题。
三、摘要式身份认证
摘要式身份验证提供与基本身份验证相同的功能,即当用户访问http://localhost 时同样弹出输入账号和密码的对话框。但是这种认证方式在通过网络发送用户凭据方面提高了安全性。具体流程如下:

- 客户从运行 IIS 的服务器请求文件。
- IIS 拒绝请求,告诉给客户端正在使用摘要式身份验证,并发送领域名称。
- Internet Explorer 提示用户输入凭据(用户名和密码)。然后,Internet Explorer 合并这些凭据和领域名称以创建一个 MD5 哈希,并从运行 IIS 的服务器重新提交文件请求,此时发送的是 MD5 哈希。
- 运行 IIS 的服务器接收哈希,并将客户端的哈希发送到域控制器以进行验证。
- 域控制器向运行 IIS 的服务器通知验证结果。
- 如果客户端已经过身份验证,则 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使用匿名认证以外的任何带输入框的认证,效果如下:

通常情况这种方式并没什么卵用,绝大多数情况我们的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
.NET Web的身份认证的更多相关文章
- 用Azure AD 实现Web 应用身份认证的Multi-Factor Authentication(MFA)
最近客户有个需求,希望把面向public的Web应用中的终端用户数据库由Azure AD来实现,同时希望可以用MFA来实现用户身份认证.这个想法非常好,通过使用Azure的managed servic ...
- ASP.NET Web API教程(六) 安全与身份认证
在实际的项目应用中,很多时候都需要保证数据的安全和可靠,如何来保证数据的安全呢?做法有很多,最常见的就是进行身份验证.验证通过,根据验证过的身份给与对应访问权限.同在Web Api中如何实现身份认证呢 ...
- Asp.net MVC使用FormsAuthentication,MVC和WEB API可以共享身份认证 (转载)
在实际的项目应用中,很多时候都需要保证数据的安全和可靠,如何来保证数据的安全呢?做法有很多,最常见的就是进行身份验证.验证通过,根据验证过的身份给与对应访问权限.同在Web Api中如何实现身份认证呢 ...
- 小白日记36:kali渗透测试之Web渗透-手动漏洞挖掘(二)-突破身份认证,操作系统任意命令执行漏洞
手动漏洞挖掘 ###################################################################################### 手动漏洞挖掘 ...
- webapp用户身份认证方案 JSON WEB TOKEN 实现
webapp用户身份认证方案 JSON WEB TOKEN 实现Deme示例,Java版 本项目依赖于下面jar包: nimbus-jose-jwt-4.13.1.jar (一款开源的成熟的JSON ...
- 关于ASP.Net Core Web及API身份认证的解决方案
6月15日,在端午节前的最后一个工作日,想起有段日子没有写过文章了,倒有些荒疏了.今借夏日蒸蒸之气,偷得浮生半日悠闲.闲话就说到这里吧,提前祝大家端午愉快(屈原听了该不高兴了:))!.NetCore自 ...
- 身份认证系统(一)单WEB应用的身份认证
身份认证技术,也就是所谓的登录功能,是现代WEB系统最常见的功能之一.本系列文章就试图为大家详细的介绍身份认证技术. Basic认证模式 Basic认证模式是较早被广泛应用的一种HTTP标准提供的认证 ...
- java web项目war包部署,使用tomcat对指定接口设置身份认证
先简单说一下需求: 将一个基于springboot2.0开发的java web项目打成war包,通过tomcat部署到一台linux服务器上,项目相关的一些图片等资源也按照一定规则放置在服务器构建好的 ...
- ASP.NET Web API 2系列(四):基于JWT的token身份认证方案
1.引言 通过前边的系列教程,我们可以掌握WebAPI的初步运用,但是此时的API接口任何人都可以访问,这显然不是我们想要的,这时就需要控制对它的访问,也就是WebAPI的权限验证.验证方式非常多,本 ...
随机推荐
- 使用Python保存屏幕截图(不使用PIL)
起因 在极客学院讲授<使用Python编写远程控制程序>的课程中,涉及到查看被控制电脑屏幕截图的功能. 如果使用PIL,这个需求只需要三行代码: from PIL import Image ...
- 12306官方火车票Api接口
2017,现在已进入春运期间,真的是一票难求,深有体会.各种购票抢票软件应运而生,也有购买加速包提高抢票几率,可以理解为变相的黄牛.对于技术人员,虽然写一个抢票软件还是比较难的,但是还是简单看看123 ...
- 学点HTTP知识
不学无术 又一次感觉到不学无术,被人一问Http知识尽然一点也没答上来,丢人丢到家了啊.平时也看许多的技术文章,为什么到了关键时刻就答不上来呢? 确实发现一个问题,光看是没有用的,需要实践.看别人说的 ...
- 背后的故事之 - 快乐的Lambda表达式(一)
快乐的Lambda表达式(二) 自从Lambda随.NET Framework3.5出现在.NET开发者眼前以来,它已经给我们带来了太多的欣喜.它优雅,对开发者更友好,能提高开发效率,天啊!它还有可能 ...
- Dreamweaver 扩展开发:C-level extensibility and the JavaScript interpreter
The C code in your library must interact with the Dreamweaver JavaScript interpreter at the followin ...
- QT5利用chromium内核与HTML页面交互
在QT5.4之前,做QT开发浏览器只能选择QWebkit,但是有过使用的都会发现,这个webkit不是出奇的慢,简直是慢的令人发指,Release模式下还行,debug下你就无语了,但是webkit毕 ...
- 尝试asp.net mvc 基于controller action 方式权限控制方案可行性
微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...
- 分页插件--根据Bootstrap Paginator改写的js插件
刚刚出来实习,之前实习的公司有一个分页插件,和后端的数据字典约定好了的,基本上是看不到内部是怎么实现的,新公司是做WPF的,好像对于ASP.NET的东西不多,导师扔了一个小系统给我和另一个同事,指了两 ...
- jQuery可自动播放动画焦点图插件Koala
Koala是一款简单而实用的jQuery焦点图幻灯片插件,焦点图不仅可以在播放图片的时候让图片有淡入淡出的动画效果,而且图片可以自动播放.该jQuery焦点图的每一张图片都可以设置文字描述,并浮动在图 ...
- asp.net core 负载均衡集群搭建(centos7+nginx+supervisor+kestrel)
概述 本文目的是搭建三台asp.net core 集群, 并配上 nginx做负载均衡 首先准备要运行的源码 http://pan.baidu.com/s/1c20x0bA 准备三台服务器(或则虚 ...