这篇文章是为了对asp.net的身份验证体系不熟悉的朋友准备的。所以如果您对身份验证(authenticate )和授权(authorization )非常熟悉完全可以略过。 这篇文章重点介绍asp.net中的身份验证和授权的概念及实现.
当你建立了一个网站后,总是要考虑哪些资源(狭义的认为就是页面)是可以直接访问的哪些资源是需要有限的访问的。简单而言,你需要一种机制能够协助你判断那些用户才是一个合法的用户(授权的用户,一般需要经过“登录认证”的),这就是我要讲的第一个概念:身份验证机制。然而仅能判断用户是否是合法是不够的,你还需要确定那些是资源是受限资源(狭义的讲就是经过身份验证的用户才能访问的)哪些资源是可以随便访问的,这就是我要讲的第二个概念:授权。
首先来解释一下授权:简单一点的授权概念就是如何设置哪些资源是可以访问的而哪些资源是需要认证后的用户才能访问的一种机制。比如:Default.aspx一般是任何人都可以访问的,然后Car.aspx(购物车页面)是认证用户才可以访问的, 这是可想而知的。简单啊!!
复杂的情况下,授权不单单只是限制哪些资源可以直接访问而哪些不能。可以通过授权做到更为复杂的访问限制,如管理员可以访问后台资源而一般经过认证的用户可以访问前台的一些受限资源,没有经过验证的用户可以访问任意不受限资源之类的...。这种场景都依赖授权来完成。授权是整个安全概念中的一个基础点。我们就将它作为起点来谈谈ASP.NET是如何利用授权的。
在ASP.NET中我们总是要和一个文件打交道,这个就是web.config文件,它控制着你的整个ASP.NET程序的行为。授权也在这个文件中有所体现。下面我们来看看WEB.CONFIG文件中的一个片段。
在<system.web>配置节下我们可以如下设置
<authorization>
<deny users="?"/>
</authorization>
</system.web>
上面的配置将限制任何未获得认证的用户(没有登录的用户)不能访问任何资源。这个配置所带来的效果是任何匿名用户无法访问任何资源(页面)。这是授权的最简单的体现。再看一个比较复杂的。
<deny users="*"/>
<allow roles="admin"/>
</authorization>
这个配置表明限制任何用户访问(不管是匿名用户还是通过了认证的用户)但如果这个用户是属于admin组的用户可以访问。更多的细节在稍后的章节中会涉及,这个仅仅只是为了理解授权而设计的几个范例。
简单而言,其实授权就是限制哪些用户有权利访问哪些资源的一种机制。对安全概念而言,至少我认为理解授权是很重要的。
接下来我们将要理解一下什么是身份验证。上面我不断的提到匿名用户和认证用户,我们通常也称认证用户为获得凭证的用户。犹如看电影你需要凭票入内是一样,你需要花钱获得一张小票,它可以证明你是可以入内享受电影带来的乐趣的。那如何验证一个用户(就是给用户一个可以被系统识别的凭证)呢?这就是身份验证机制所负责的。那么身份验证指的就是如何验证一个用户或给用户发放有效的可被系统识别的凭证的一种机制。
同样,我们看看ASP.NET是如何做的。在ASP.NET中身份验证的方式有以下三种, Window, Form, Passport方式。
Window身份验证方式:是一种与IIS配合在一起的一种认证方式。在IIS中已经提供了匿名身份验证、Windows 集成的 (NTLM) 身份验证、Windows 集成的 (Kerberos) 身份验证、基本(base64 编码)身份验证、摘要式身份验证以及基于客户端证书的身份验证。以下是web.config文件支持Window身份验证的典型配置。它也是Asp.Net的默认验证方式。
<authentication mode="Windows"/>
</system.web>
Form身份验证方式:通过ASP.NET提供的登录页面进行认证的一种方式,这也是最常见的一种验证方式,也是我今天重点要讲解的方式。以下是web.config文件支持Form身份验证的典型配置。
<authentication mode="Forms">
<forms name=".ASPXFORMSAUTH" defaultUrl="default.aspx" path="/"
protection="All" loginUrl="SignIn.aspx" timeout="30"/>
</authentication>
</system.web>
Passport 身份验证是由 Microsoft 提供的集中身份验证服务,该服务为成员站点提供单一登录和核心配置文件服务。Passport 之所以让用户受益匪浅,原因在于用户不必登录访问受到限制的新资源或站点。
<authentication mode= "Passport"/>
</system.web>
和授权一样,身份验证同样在web.config文件中体现了自己所在,只所以都利用配置文件只因为它控制着整个ASP.NET的应用行为。
接下来,我将利用上面的概念完成一个简单的例子,概要的看看身份验证和授权是如何一起工作的。这下面的例子中我将使用Form身份验证方式。
1.我们建立一个名为SecurityWebSiteDemo的asp.net网站。
2.我们在建立的网站中建立一个web.config文件。
3.打开web.config文件在<system.web>配置节下写入一下片段:
<forms defaultUrl="Default.aspx" loginUrl="Login.aspx" path="/"
name=".ASPNETAUTHEN" />
</authentication>
<authorization>
<deny users="?"/>
</authorization>
以上的配置完成了几件事情。
1.设置当前的ASP.NET程序的身份验证方式是Forms,并且在<forms>节中指出一下几点:
a.默认的页面:Default.aspx.
b.用于提供给用户进行登录的页面:Login.aspx
2.授权配置为决绝任何未经过身份验证的用户进行登录。
3.通过上面的解释我们知道Forms验证方式需要我们自己提供一个页面给用户,以便用户可以通过指定的页面提交自己的验证信息(一般是用户名加密码)。所以我们需要自己建立一个Login.aspx页面。
asp.net 2.0中为我们提供了一套有用的登录控件,可以直接利用相关的控件就可以了。如上图我拖入了一个Login控件,它可以帮助我收集用户的必要信息以便我们可以处理它。接下来我们需要编写一些代码来完成认证的过程(也被成为授予凭证的过程)。
2 {
3 if (this.Login1.UserName == "Cai" && this.Login1.Password == "Cai")
4 e.Authenticated = true;
5 else
6 e.Authenticated = false;
7 }
Login控件提供了一个Authenticate事件,我们可以通过设置事件参数e.Authenticated的值来确定当前的这个用户是否可以获得一个凭证(或是有效的合法的用户)。上面的代码中我们可以看出,我们完全可以控制如何认定一个用户。
到此程序建立完成,你可以设置Default.aspx页面为起始页,然后启动调试。你会发现你得到的是Login.aspx页面而不是Default.aspx页面。再你填写了正确的用户名和密码后你将看见Default.aspx页面。
完成。