保护 ASP.NET 应用的安全

 

这里很多人都有丰富的ASP.NET web应用开发经验,但是可能有很多人对应用的安全没有足够的重视,下面就ASP.NET的安全问题做一个简要的叙述。

1.   概述

1.1. 配置文件

在创建Asp.net的应用时,Asp.net为我们提供了配置文件来配置session state、授权和认证等等。有两个配置文件:

(1)       Maching.config——用来定义server的配置,安装.net framework的时候就安装了此文件,位于%winDir%\Microsoft.Net\Framework\yourVersion\Config目录下。此文件中的配置是应用于本机所有虚拟目录的。

(2)       Web.config——针对各个具体的web应用的配置,在各自asp.net应用的目录下。每个asp.net有自己的web.config文件,而此应用下的每个子目录也可以有自己的web.config文件,而且下级的web.config文件中的设置覆盖上级web.config文件中的设置。

1.2. ASP.NET 安全基础

开发一个安全的ASP.NET应用必须考虑下面的基本的安全装置:

(1)       Authentication——检查用户的身份。

(2)       Authorization——根据用户的身份确定其能访问哪些资源。

(3)       Impersonation——就是一个线程使用不同于其所在进程的身份去执行操作的能力。

 

System.Web.Security 名字空间中提供了很多关于应用安全的类。如:FormsAuthenticationFormsIdentityPassportIdentity。具体请查阅MSDN

2.   ASP.NET应用中执行验证

验证——通俗地说就是要检查来访者的身份——“来者何人?”

2.1. ASP.NET验证

ASP.NET使用authentication provider来实现验证,这些provider包括:

l         IIS authentication

l         Windows-based authentication

l         Forms-based authentication

l         Passport authentication

l         Anonymous authentication

下面分别说明之:

(1)       IIS 认证。任何Web请求必须先通过IIS来访问ASP.net应用,IIS的认证可以通过IIS管理器进行配置。IIS提供了多种认证装置,这包括:

l         Anonymous access——匿名访问。当不需要验证用户身份的时候使用此方式。

l         Basic authentication——基本认证。需要用户提供用户名和密码,但以明文传输。这通常需要和SSL/TLS结合使用。

l         Digest authentication——摘要式认证。和基本认证类似,但不直接传输明文,而是传输Hash值。而且,需要IIS Server必须在一个windows域中,且使用AD来保存用户帐户。

l         Integrated Windows authentication——整合的windows认证。使用windows认证协议通信,使用操作系统中的帐户。

l         Client certificate authentication——客户端证书认证。使用X.509数字证书来验证访问者身份。

 

(2)       基于Windows的认证。ASP.net应用依赖windows操作系统去验证用户。此为默认选想。验证的过程为:Client端请求一个页面——>IIS检查windows帐户,如果不合法则要求其登录——>用户登录成功后,返回其请求的页面。此验证方式对于有proxy server的情况下不能工作。

(3)       基于表单的认证。此认证方式使用HTTP 客户端重定向来重定向未验证通过的请求到一个HTML表单。其过程为:Client端请求一个页面——>ASP.net检查客户端的cookie,如果没有发现则让用户登录——>用户登录成功后,返回页面和验证cookie给请求者。此验证方式需要开发者写验证逻辑。

(4)       Passport认证。由微软提供的集中认证服务。

(5)       匿名认证。

 

2.2. Form 验证

步骤为:

(1)       IIS管理器中设置IIS为匿名访问。

(2)       web.config文件配置为Form认证方式。

<system.web>
<authentication mode="Forms">
<forms loginUrl="login.aspx" />
</authentication>
</system.web>


另一个例子:

 

<authentication mode="Forms">
   
<forms name="SavingsPlan" loginUrl="/logon.aspx">
      
<credentials passwordFormat="SHA1">
         
<user name="Kim"
               password
="07B7F3EE06F278DB966BE960E7CBBD103DF30CA6"/>
         
<user name="John"
               password
="BA56E5E0366D003E98EA1C7F04ABF8FCB3753889"/>
      
</credentials>
   
</forms>
</authentication>

 

(3)       建立授权。在web.config文件中配置<authorization>节来设定接收或者拒绝用户访问,还可以设置哪些页面需要认证。

(4)       建立一个登录页面。在这个页面上要求用户输入用户名和密码,然后到保存帐户信息的地方进行检查。你可以把帐户信息放在配置文件、注册表、数据库或者AD中。

2.3. Windows 验证

步骤为:

(1)       设置IISwindows认证,选择basicDigestIntegrated windows其中的一种方式。

(2)       配置web.config

<system.web>
<authentication mode="Windows" />
</system.web>

 

<location path="ShoppingCart.aspx">
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</location>

 另外还可以使用Passport(微软提供了个Web Service)验证,但这个是需要费用的,通常我们不予考虑。

3.   授权

验名来访者的身份后,就需要查询事先设定好的安全策略,以决定授予此来访者什么样的权限。

3.1. ASP.NET 授权

可以使用授权来确定是否一个通过验证的用户已经访问了某个特定的资源。这个授权过程可以让我们限制用户的访问权限——通过赋予或者取消一个用户所能拥有的特定权限。ASP.NET提供了两种授权方式:文件授权和URL授权。

(1)       文件授权。当我们使用windows认证的时候,此方式自动生效,它基于IIS的认证。当用户尝试访问某个ASP.NET应用的受保护资源的时候,IIS首先对其进行验证,之后,ASP.NET检查NTFS文件权限或者ACL来确定此用户是否有权限访问资源。

(2)       URL授权。当不使用windows认证的时候,可以使用URL授权。当用户尝试访问某个资源时,URL授权机制根据ASP.NET验证过程分配给application的角色和application的身份来同意或者拒绝请求者对资源的访问。使用URL授权可以做如下几件事情:

!  Deny or allow access to individual users or groups of users.

!  Deny or allow access to specific roles.

!  Restrict access based on the type of HTTP action attempted, such as Get or Post.

例子:

<authorization>
<allow users="Domain\user1, Domain\user2"/>
<deny users="*"/>
</authorization>


拒绝匿名用户访问(?代表匿名用户,*代表任何用户):

<authorization>
<deny users="?"/>
</authorization>


只有拥有Domain\Administrators角色的用户才可访问:

<authorization>
<allow roles="Domain\Administrators"/>
<deny users="*"/>
</authorization>


注意配置节中的内容是有顺序关系的,ASP.NET查找<authorization>的子项,直到找到了匹配当前用户的规则(rule)。

任何人都不能访问:

<authorization>
<deny users="*"/>
<allow roles="Domain\Administrators"/>
<allow users="Domain\user1, Domain\user2"/>
</authorization>


使用Verb属性可以限制HTTP的动作(Action):

<allow VERB="POST" users="user1, user2" />
<deny VERB="POST" users="*" />
<allow VERB="GET" users="*" />

 

4.   扮演(Impersonation

有时,我们可能需要使用通过验证的请求者的身份来允许我们的应用,那我们可以使用Impersonation(扮演)。此处的扮演和Windows的扮演有略微不同。

4.1. ASP.NET 扮演

扮演允许一个asp.net应用允许于合法请求者的安全上下文中;典型的,服务器端的某个线程扮演一个客户端,它可以象这个客户端那样访问服务器资源,或者验证对此客户端自己的对象的访问。比如,一个文件服务器,拥有一些记录了秘密信息的文件;为了保护一个未授权的客户端访问这些秘密数据,服务器可以在访问这些文件之前扮演为客户端,这样能提高应用的安全性。当启用扮演后,asp.net应用依赖IIS验证请求者的身份。

4.2. ASP.NET 应用中执行IIS扮演

扮演在默认情况下是不可用的,可以通过配置启用之:

<configuration>
<system.web>
<identity impersonate="true"/>
</system.web>
</configuration>


扮演某个特定的windows用户:

<configuration>
<system.web>
<identity impersonate="true" userName="MACHINE\user1"
password
="exam"/>
</system.web>
</configuration>

 

5.   保护Web FilesFolders

5.1. Web Folder 权限

为阻止未授权地访问web应用,我们需要分配合适的权限给那些可以通过web访问到的文件夹,这被称为web folder permission

虚拟目录包括以下权限:

(1)       Read——查看目录、文件内容和属性。

(2)       Write——允许修改文件或者目录的内容和属性。

(3)       Script source access——允许访问源文件。需要ReadWrite权限作为前提。

(4)       Directory browsing——允许查看文件列表。

(5)       Log visits——记录用户访问的每个网站。

执行权限:

(1)       None——不能server上执行script和可执行程序。

(2)       Scripts Only——只能在server上执行脚本。

(3)       Scripts and Executables——在serverScript和可执行程序都可以执行。

5.2. 保护Web Application Files

有如下保护措施:

(1)       File and folder ACLs——使用windows操作系统提供的访问控制列表机制。

(2)       IIS Security——IIS提供了一些安全设定。

(3)       Web.config——配置文件提供了一些关于安全的配置节,通过设置这些配置节可以保护文件和目录安全。这些配置节有:

l         <authentication>

l         <authorization>

l         <location>

例子:

<configuration>
<system.web>
<authentication mode="None" />
</system.web>
</configuration>

 

<configuration>
<system.web>
<authorization>
<allow roles="Admins" />
<deny users="*" />
</authorization>
</system.web>
</configuration>

 

<location path="Default Web Site/WhoAmI">
<system.web>
<identity impersonate ="true" userName ="London\Administrator"
password 
="P@ssw0rd" />
</system.web>
</location>

 

posted @ 2005-08-05 17:54  风满袖  阅读(3737)  评论(18编辑  收藏  举报