asp.net中常用的几种身份验证方式

前言

在B/S系统开发中,经常需要使用“身份验证”。因为web应用程序非常特殊,和传统的C/S程序不同,默认情况下(不采用任何身份验证方式和权限控制手段),当你的程序在互联网/局域网上公开后,任何人都能够访问你的web应用程序的资源,这样很难保障应用程序安全性。通俗点来说:对于大多数的内部系统、业务支撑平台等而言,用户必须登录,否则无法访问和操作任何页面。而对于互联网(网站)而言,又有些差异,因为通常网站的大部分页面和信息都是对外公开的,只有涉及到注册用户个人信息的操作,或者网站的后台管理等才需要提示登录。(如果不做严格验证,后果将很严重,人家一旦猜出你web目录下面的页面名,可以随意访问。当然,一般的开发人员是不会犯这种低智商的错误的)。

 

如何实现“身份验证”

记得N年前我最早接触Servlet + JSP开发的时候,有一种叫做“过滤器”(Filter)的东西,真是很神奇。有了这件神奇的东西后,我再也不需要去每个页面判断什么“session”或者“cookie”了,就能把未登录用户给弹出去(水平实现有限)。当然,在传统webform开发中,也可以写一个“BasePage的鸡肋”,在该类中去做判断,让每个页面对应的类都去实现这个"鸡肋",我看以前很多公司都是这么干的。

在asp.net中,其实微软提供了一整套的完整的机制来实现“成员角色管理”。包含有:”登录控件”、“membership”、“个性化数据库”等等。但是大多数开发人员是从来不用这些的(例如我,用微软的asp.net三四年,还从来没见过“登录控件”长啥样)。在asp.net身份验证中,主要有三四种。因为有些身份验证的方式是依赖于IIS和windows操作系统的,所以在不同版本的操作系统和IIS上还是有些差异的。由于笔者暂时使用的是windows 7的操作系统,所以就拿IIS 7.5为例子。

首先打开IIS,然后双击右侧“身份验证”,会显示出当前IIS支持的所有的身份验证方式(由于我安装IIS时候,在“安全性”那里我是全部勾选的)。可以看到如图:

 

大致分为如下几种:

1.活动目录的客户端证书(这个很可能是收费的),不常用,不细说。

2.ASP.NET模拟(MSDN:如果要在 ASP.NET 应用程序的非默认安全上下文中运行 ASP.NET 应用程序,请使用 ASP.NET 模拟。),机器人说的我听不懂。

3.Form身份验证:这个用的很多,后面会细说。

4.windows身份验证:基于windows操作系统的用户或者域用户的身份验证。

5.基本身份验证:其实也是基于windows操作系统的账户验证的。

6.匿名身份验证:谁都可以访问,其内部也是通过指定一个特定的windows系统的user账户来访问的。

7.摘要身份验证:使用 Windows 域控制器对请求访问 Web 服务器内容的用户进行身份验证。

再来看看经典的 IIS 6的截图:

 注:.NET Passport 可以理解为微软对“单点登录”的一种实现方案,这里不细说。感兴趣的朋友可以参考http://baike.baidu.com/view/1182418.htm及相关资料。在“Open API”  "SOA"  “云计算”大行其道的今天,作为一个web程序员,如果你还没听说过“单点登录”,请自行购买开往福州方向的动车票。

 

先在IIS 7上测试一下基本身份验证:

首先把其他的身份验证方式全部禁用掉,然后仅仅启用“基本身份验证”。有图有真相:

然后打开IE、FireFox、chrome等浏览器,敲入localhost,等待打开IIS上的默认网站。你会发现,浏览器端都会弹出提示框信息,而且在不同浏览器上弹出框的样式和表现形式也有所差异。(长期不用IE,发现360这个老流氓把哥的首页给改了,还号称”安全上网“,这明显是篡改行为嘛。搞不懂。)

FireFox中:

如果你在弹出框中,输入正确的windows账户和密码,则可以正常的浏览你请求的网页。如果你不输或者输错了,等待你的将是401错误(401,你懂得)。

 

”没有为网站启用SSL,将通过电缆以明文的方式.....”,机器人说的话听起来很别扭,这里,我解释一下。

当你没有花钱去买SSL证书(安全套接层,你可以简单的理解为:正常http请求都是明文传送,使用SSL后可以帮你把http报文自动加密,就算有人在互联网上截获了也无法解密。我们偶尔访问有些网站的时候,看到的“https://www.xxx.com”,就极可能是基于SSL证书的形式)。至于“通过电缆以明文的方式...”,其实这句话说的很不对,首先,电缆只是一种传输介质,里面传送的只是电脉冲、光信号等等,而不是网络协议报文(学过计算机网络的都知道)。至于说“采用明文的形式”,也不对,其实“基本身份验证”中,是将用户名和密码采用了Base64编码的,感兴趣的读者,可以用httpwatch或者Fiddler之类的工具去监视一下http请求,我这里就不做演示了 。只是由于Base 64编码很容易反编码,所以和明文没啥区别。这样一来,你会发现“基本身份验证”方式,确实存在很多不安全因素。

 

在IIS 7上测试一下 windows 身份验证:

和之前的基本身份验证差不多,我就不再截图演示了。如果用户输入正确的windows用户名和密码,则能够正常访问网站。如果输入错误的,则返回的401.1(前面基本身份验证是401.2)。值得一提的就是,记得之前有位asp.net MVP 曾告诉过我,使用windows身份验证的时候,只能用户在使用IE浏览器时候才能够正常访问。因为这种情况下,不是使用http报文传输的形式,而是浏览器端直接与操作系统内部交互,进行用户名和密码的验证。经过证实,发现这话的后半句是对的,确实监视不到http实体内容。但不仅仅局限于IE浏览器,我在firefox中也能够正常的访问和使用。

 

匿名身份验证:

所谓匿名身份验证,其实就可以理解为“不验证”。就是匿名用户都可以访问资源,没有任何限制。通常我们的网站,都要启用匿名方式验证,集成windows身份验证。不难发现,其实匿名身份验证,也是通过windows用户组里面的一个特定的用户来通过验证的,如图所示:

 

最后一种,Form身份验证:

前面所讲的那些身份验证方式,其实都和asp.net没有直接的联系,都是IIS 和操作系统级别的验证方式。而Form 身份验证,则需要asp.net提供支持。因为通常网站的身份验证和成员管理都非常复杂,而不是通过单纯的某一种验证方式能够实现的。对于大部分互联网的网站而言,用户可以访问部分页面,但部分页面必须登录后才能访问和操作,而且不同用户角色登录,操作权限也不一样。这又会涉及到很多方面的知识,而且实现方式也有很多种。

由于篇幅和时间有限,今天就先到此。后期我再详细地去整理关于Form身份验证的详细及成员管理,权限管理方面的文章,敬请期待。

 

本文出自   http://blog.csdn.net/dinglang_2009   http://www.cnblogs.com/dinglang/,转载请注明出处。

时间: 2024-08-03 18:43:58

asp.net中常用的几种身份验证方式的相关文章

asp.net身份验证方式介绍_实用技巧

windows身份验证: IIS根据应用程序的设置执行身份验证.要使用这种验证方式,在IIS中必须禁用匿名访问. Forms验证:用Cookie来保存用户凭证,并将 未经身份验证的用户重定向到自定义的登录页. Passport验证:通过Microsoft的集中身份验证服务执行的,他为成员站点提供单独登录 和核心配置文件服务. 一. 配置windows身份验证 1)配置IIS设置 2)设置Web.config <system.web> <authentication mode = &quo

ASP.NET中常用的文件上传下载方法

asp.net|上传|下载     文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给出几种常见的方法,本文主要内容包括:1.如何解决文件上传大小的限制2.以文件形式保存到服务器3.转换成二进制字节流保存到数据库以及下载方法4.上传Internet上的资源 第一部分:    首先我们来说一下如何解决ASP.NET中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,我们可以采用更改WEB.Config文件来自定义最大文件大小,如下:<

Asp.NET中常用的一些优化性能的方法

asp.net|性能|优化 Asp.NET中常用的一些优化性能的方法 ASP.NET 的缓存机制相比ASP有很大的改进,本文档除对常用优化方法进行总结介绍外,强调了如何使用ASP.NET的缓存来获得最佳性能. 1:不要使用不必要的session和ASP中一样,在不必要的时候不要使用Session. 可以针对整个应用程序或者页面禁用会话状态: l 禁用页面的会话状态 l 禁用应用程序的会话状态 在应用程序的Web.Config文件的sessionstate配置节中,将mode属性设置为off. 即

asp.net中常用到的SQL分页存储过程

asp.net中常用到的SQL分页存储过程 以下是引用片段:create PROCEDURE [dbo].[myPage] @tblName varchar(255), -- 表名 @fldName varchar(255), -- 排序的字段名,一般为唯一标识 @strGetFields varchar(1000) = ' * ', -- 需要返回的列  @PageSize int = 10, -- 每页有多少条记录 @PageIndex int = 1, -- 第几页 @Count int 

asp.net中使用基于角色的身份Forms验证,大致分为四个步骤

asp.net asp.net中使用基于角色的身份Forms验证,大致分为四个步骤1.配置系统文件web.config<system.web> <authentication mode="Forms" >  <forms name=".yaoCookies" loginUrl="/duan/Manage/login.aspx" protection="All"  timeout="20&

Excel表格中常用的三种数据转置的方法

  Excel表格中常用的三种数据转置的方法          如下图所示,需要将A2:B9的内容,转变为D列的样子. 思考一下,有几种方法能实现呢? 这个题目乍一看是有点难度的高大上,是不是啊? 1.VBA代码法 按Ctrl+F11,打开VBE编辑器,在代码窗口中写上以下代码: Sub run() For i = 1 To 8 Cells(2 + (i - 1) * 2, 4) = Cells(i + 1, 1) Cells(3 + (i - 1) * 2, 4) = Cells(i + 1,

extJS中常用的4种Ajax异步提交方式

 这篇文章主要介绍了extJS中常用的4种Ajax异步提交方式,需要的朋友可以参考下 /**   代码如下: * 第一种Ajax提交方式  * 这种方式需要直接使用ext Ajax方法进行提交  * 使用这种方式,需要将待传递的参数进行封装  * @return  */  function saveUser_ajaxSubmit1() {  Ext.Ajax.request( {  url : 'user_save.action',  method : 'post',  params : { 

ASP.NET的中自定义类实现统一身份验证程序代码

在ASP.NET开发过程中,经常会进行身份验证.比较麻烦的做法是,对每个页面添加验证代码.我们知道,ASP.NET的页面都继承自System.Web.UI.Page类,我们可以自定义一个类,让它继承自Page类,并在该类中添加验证操作.然后让需要验证的页面类,继承自我们定义的这个类,就可以实现统一验证功能. 1.创建用于验证页面的基类BasePage,该类继承自Page类  代码如下 复制代码 using System; using System.Data; using System.Linq;

ASP.NET中常用输出JS脚本的类实例_实用技巧

本文实例讲述了ASP.NET中常用输出JS脚本的类,针对过去输出js脚本的类进行了一定的改进.在项目开发中非常具有实用价值.分享给大家供大家参考.具体如下: 很多时候在ASP.NET中我们经常需要输出一些JS脚本,比如弹出一个警告窗口,返回到历史页面等JS功能,我看到网上流传得比较广的是马先光写的一个JScript类,这个类基本将经常用到的JS脚本包含了,非常方便,唯一的不足是作者采用的Response.Write(string msg)的办法,这样造成输出的js脚本在<html></h