百度一下”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 时同样弹出输入账号和密码的对话框。但是这种认证方式在通过网络发送用户凭据方面提高了安全性。具体流程如下:

  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使用匿名认证以外的任何带输入框的认证,效果如下:

通常情况这种方式并没什么卵用,绝大多数情况我们的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的身份认证的更多相关文章

  1. 用Azure AD 实现Web 应用身份认证的Multi-Factor Authentication(MFA)

    最近客户有个需求,希望把面向public的Web应用中的终端用户数据库由Azure AD来实现,同时希望可以用MFA来实现用户身份认证.这个想法非常好,通过使用Azure的managed servic ...

  2. ASP.NET Web API教程(六) 安全与身份认证

    在实际的项目应用中,很多时候都需要保证数据的安全和可靠,如何来保证数据的安全呢?做法有很多,最常见的就是进行身份验证.验证通过,根据验证过的身份给与对应访问权限.同在Web Api中如何实现身份认证呢 ...

  3. Asp.net MVC使用FormsAuthentication,MVC和WEB API可以共享身份认证 (转载)

    在实际的项目应用中,很多时候都需要保证数据的安全和可靠,如何来保证数据的安全呢?做法有很多,最常见的就是进行身份验证.验证通过,根据验证过的身份给与对应访问权限.同在Web Api中如何实现身份认证呢 ...

  4. 小白日记36:kali渗透测试之Web渗透-手动漏洞挖掘(二)-突破身份认证,操作系统任意命令执行漏洞

    手动漏洞挖掘 ###################################################################################### 手动漏洞挖掘 ...

  5. webapp用户身份认证方案 JSON WEB TOKEN 实现

    webapp用户身份认证方案 JSON WEB TOKEN 实现Deme示例,Java版 本项目依赖于下面jar包: nimbus-jose-jwt-4.13.1.jar (一款开源的成熟的JSON ...

  6. 关于ASP.Net Core Web及API身份认证的解决方案

    6月15日,在端午节前的最后一个工作日,想起有段日子没有写过文章了,倒有些荒疏了.今借夏日蒸蒸之气,偷得浮生半日悠闲.闲话就说到这里吧,提前祝大家端午愉快(屈原听了该不高兴了:))!.NetCore自 ...

  7. 身份认证系统(一)单WEB应用的身份认证

    身份认证技术,也就是所谓的登录功能,是现代WEB系统最常见的功能之一.本系列文章就试图为大家详细的介绍身份认证技术. Basic认证模式 Basic认证模式是较早被广泛应用的一种HTTP标准提供的认证 ...

  8. java web项目war包部署,使用tomcat对指定接口设置身份认证

    先简单说一下需求: 将一个基于springboot2.0开发的java web项目打成war包,通过tomcat部署到一台linux服务器上,项目相关的一些图片等资源也按照一定规则放置在服务器构建好的 ...

  9. ASP.NET Web API 2系列(四):基于JWT的token身份认证方案

    1.引言 通过前边的系列教程,我们可以掌握WebAPI的初步运用,但是此时的API接口任何人都可以访问,这显然不是我们想要的,这时就需要控制对它的访问,也就是WebAPI的权限验证.验证方式非常多,本 ...

随机推荐

  1. 实现代理设置proxy

    用户在哪些情况下是需要设置网络代理呢? 1. 内网上不了外网,需要连接能上外网的内网电脑做代理,就能上外网:多个电脑共享上外网,就要用代理: 2.有些网页被封,通过国外的代理就能看到这被封的网站:3. ...

  2. C++随笔:.NET CoreCLR之corleCLR核心探索之coreconsole(2)

    这篇文章是上篇的续集,本文将会继续介绍coreconsole.cpp里面的逻辑.也许大家会看一些CLR的书,我承认我没有看过,因为我觉得一个人,他再NB,那也是他自己的眼光,而且说句难听的,CLR也不 ...

  3. TYPESDK手游聚合SDK服务端设计思路与架构之一:应用场景分析

    TYPESDK 服务端设计思路与架构之一:应用场景分析 作为一个渠道SDK统一接入框架,TYPESDK从一开始,所面对的需求场景就是多款游戏,通过一个统一的SDK服务端,能够同时接入几十个甚至几百个各 ...

  4. centos6和centos7防火墙的关闭

    CentOS6.5查看防火墙的状态: [zh@localhost ~]$service iptable status 显示结果: [zh@localhost ~]$service iptable st ...

  5. 跨域问题,前端主动向后台发送cookie

    跨域是什么? 从一个域名的网页访问另一个域名的资源,就会出现跨域.只要协议.端口.域名有一个不同就会出现跨域 例如: 1.协议不同  http://www.baidu.com:80 和 https:/ ...

  6. Princeton Algorithms week3 Assignment

    这周编程作业是实现检测点共线的算法.和排序算法有关系的地方在于,对斜率排序后可以很快的检测出来哪些点是共线的,另外这个算法的瓶颈也在于排序的性能. 一点收获: java传参数时传递的是值,这很多人都知 ...

  7. JS or C#?不存在的脚本之争

    前言: 又来到了周末,小匹夫也终于有了喘口气写写博客的时间和精力.话说周五的下午,小匹夫偶然间晃了一眼蛮牛的QQ群,又看到了一个Unity3D开发中老生长谈的问题,“我的开发语言究竟是选择JavaSc ...

  8. .NET面试题系列[3] - C# 基础知识(1)

    1 类型基础 面试出现频率:基本上肯定出现 重要程度:10/10,身家性命般重要.通常这也是各种招聘工作的第一个要求,即“熟悉C#”的一部分.连这部分都不清楚的人,可以说根本不知道自己每天都在干什么. ...

  9. Web 项目杂记(一)

    1.Tomcat 多实例部署 在Tomcat下多实例部署后,发现如下问题,采用etc/init.d/tomcat start方式无法启动,而需要采用startup.sh.查找原因发现,是因为多实例部署 ...

  10. [翻译]Orchard如何工作

    Orchard一直是博主心中神一般的存在,由于水平比较菜,Orchard代码又比较复杂看了几次都不了了之了.这次下定决心要搞懂其工作原理,争取可以在自己的项目中有所应用.为了入门先到官网去学习一下相关 ...