.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的权限验证.验证方式非常多,本 ...
随机推荐
- NodeJs之OS
OS Node.js提供了一些基本的底层操作系统的模块OS. API var os = require('os'); console.log('[arch] 操作系统CPU架构'+os.arch()) ...
- [原]CentOS7.2部署node-mapnik
转载请注明表作者think8848及出处(http://think8848.cnblogs.com) node-mapnik依赖项中要求g++ >= 5, toolchain (>= GL ...
- 深入理解JS 执行细节
javascript从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习JS引擎工作机制之前,我们需要引入几个相关的概念:执行环境栈.全局对象.执行环境.变量对象.活动对象.作用域和作用域链等 ...
- C语言 · Anagrams问题
问题描述 Anagrams指的是具有如下特性的两个单词:在这两个单词当中,每一个英文字母(不区分大小写)所出现的次数都是相同的.例如,"Unclear"和"Nuclear ...
- ABP框架 - OData 集成
文档目录 本节内容: 简介 安装 安装Nuget包 设置模块依赖 配置你的实体 创建控制器 示例 获取实体列表 请求 响应 获取单个实体 请求 响应 获取单个实体及导航属性 请求 响应 查询 请求 响 ...
- JavaScript function函数种类
本篇主要介绍普通函数.匿名函数.闭包函数 目录 1. 普通函数:介绍普通函数的特性:同名覆盖.arguments对象.默认返回值等. 2. 匿名函数:介绍匿名函数的特性:变量匿名函数.无名称匿名函数. ...
- 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二)
前言 文章 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 中,已经完成对 gulp 的安装,由于是window环境,文中特意提到了可以通过安装 gitbash 来代替 ...
- angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用
今天我们要讲的是ng2的路由系统. 例子
- [原] KVM 环境下MySQL性能对比
KVM 环境下MySQL性能对比 标签(空格分隔): Cloud2.0 [TOC] 测试目的 对比MySQL在物理机和KVM环境下性能情况 压测标准 压测遵循单一变量原则,所有的对比都是只改变一个变量 ...
- 3种web会话管理的方式
http是无状态的,一次请求结束,连接断开,下次服务器再收到请求,它就不知道这个请求是哪个用户发过来的.当然它知道是哪个客户端地址发过来的,但是对于我们的应用来说,我们是靠用户来管理,而不是靠客户端. ...