.NET 安全编程 阅读笔记(五)

ASP.NET配置文件


ASP.NET将基于XML的配置文件作为一个简单合适的机制来使用,通过它能够配置应用程序操作的元素,这包括了重要的安全设置. ASP.NET实现了一个分级配置的文件结构,和所有的.NET应用程序一样,配置信息的主要源是machine.config, 该文件是位于.NET framework安装目录的CONFIG文件夹里,machine.config文件提供了一个中心位置,其中可以实现某些配置设置,这些设置可以在运行于计算机的所有ASP.NET应用程序上应用. ASP.NET应用程序的虚拟路径中的每个文件夹都包含一个名为web.config的配置文件,该文件为文件夹里的应用程序资源提供了配置设置,子文件夹继承其父文件夹的配置.形成类似于文件夹嵌套的结构,同时子文件夹也可以有自己的配置文件.

ASP.NET与安全有关的配置元素

Code

详细介绍如下:
<authentication>:  一种控制机制, ASP.NET 使用该机制来验证使用应用程序的用户,在应用程序根级别一下的文件夹所包含的Web.config文件中是不能指定该元素的.
<authority>: 控制能够访问文件夹含有的应用程序源的用户和角色,该元素能在配置层次节点的任意级别被配置.
<identity>: 控制是否让一个ASP.NET应用程序 过程在ASP.NET工作进程,验证后的用户或是在配置文件中指定的哟娜谷的上下文中运行, 该元素能够在配置层次结构的任意级别被配置.
<location>: 允许一个配置文件设置指定的资源或文件夹,并允许锁定这些设置以防该文件夹层结构以下的Web.config文件重写这些设置(allOverride="false"),该元素可以在配置层次结构的任意级别被配置.
<machineKey>: 指定ASP.NET应该使用哪些密钥来加密和解密forms验证与视图状态数据.该元素不能应用于根级别以下的文件夹.
<processModel>: 控制ASP.NET进程操作的许多方面, 包括了工作线程要使用的最大数字,空线程超时和内存限制,从安全角度来看,该元素允许在ASP.NET工作进程执行之下配置用户帐户,而只有在machine.config文件中才能配置该元素.
<trust>: 配置分配给ASP.NET应用程序的信任级别.该元素不能被应用程序跟级别以下的文件夹所含有的Web.config指定.
配置ASP.NET工作进程标识
ASP.NET使用一个称作池的工作进程来处理ASP.NET应用程序.默认情况下, 每个工作进程都是在名为ASPNET这个特殊的Windows账户中执行.在安装.NET Framework和ASP.NET时, 就会创建该账户,而且会分配一组受限的特权给ASPNET账户,这样可以减少应用程序所带来的风险. 通过配置<processModel>元素的userName和password属性就能改变在ASP.NET工作进程下运行的账户,而<processModel>元素是位于machine.config文件中的, 这个改变将影响计算机上运行的所有的ASP.NET应用程序.ASP.NET提供了两种预置值,可以将它们分配给userName属性来控制工作进程.
Machine: 这是默认值,它将ASP.NET应用程序作为ASPNET账户来运行.
System: 该值会把ASP.NET工作进程当作IIS操作下同样的账户来运行,默认的情况下是内置的Windows系统账户.
当使用以上两种设置时,password属性的值应该是"AutoGenerate",这样就不必指定真实的密码了.或者也可以指定运行工作进程账户的名称,userName属性指定了账户名称,password属性则在纯文本中指定了账户密码. 为了避免在配置文件中使用纯文本记录密码,可以利用Microsoft提供的Aspnet_setreg.exe程序加密用户名和密码,并将它们放到注册表中.同时将配置文件编辑为如下形式:
<configuration>
<processModel userName="registry:HKLM\Software\OReilly\AspNet,Name" password="registry:HKLM\Software\OReilly\AspNet,Password"/>
</configuration>

 身份验证

ASP.NET支持四种身份验证:none,Windows,Forms,Passport.使用IIS管理,配置设置和代码的组合来启动身份验证模式.使用应用程序的Web.config文件来为不同的ASP.NET应用程序配置不同的身份验证模式.首先,在到达ASP.NET应用程序之前,客户请求必须经过IIS身份验证.IIS身份验证的结果是提供驱动.NET身份验证机制的输入. 就ASP.NET的Windows身份验证而言,IIS身份验证能为应用程序提供验证后的Windows用户的信息.然而,就None,Forms和Passport身份验证而言,很可能会想通过启动匿名验证访问来关闭IIS身份验证.除非使用"模拟",ASP.NET身份验证对在ASP.NET应用程序下执行的Windows用户上下文是没有影响的.应用程序是在ASP.NET工作进程标识的上下文中执行的.ASP.NET身份验证能够控制分配给ASP.NET应用程序的标识和主体. 在介绍ASP.NET身份验证模式之前,我们先来讨论IIS身份验证.


配置IIS身份验证模式
配置一个文件夹或文件的IIS身份验证,必须在Internet服务管理器中选择它,打开其属性窗口, 并选择Directory Security标签单击Edit按钮打开授权方法的windows窗口. 在打开的Authentication Methods 窗口允许配置IIS支持的五种身份验证机制中的四种机制.除了匿名访问外,每种方法都依赖于客户应用程序, 该应用程序能够提供一种信任,IIS可以将该凭据映射到一个有效的Windows用户帐户中,如果该信任和Windows账户不匹配,IIS就会拒绝客户请求.具体验证机制总结如下:
匿名访问: 这是一种缺乏身份验证的访问, IIS接受任意用户请求,不会对用户进行身份验证,同时还允许对指定Windows账户身份进行模拟.
基本身份验证:当IIS设置为基本身份验证时, IIS会要求客户提供一个用户名和密码,客户应用程序会通过网络明文发送用户名和密码.
摘要身份验证: 和基本身份验证操作方法是一样的.当时客户是通过网络传递用户密码的散列码而不是明文的密码.这使得该验证方式比基本身份验证方式安全.但是需要IIS服务器成为Windows域的一个成员.
集成Windows身份验证:当IIS要求用户提供凭据时,客户应用程序是不会向用户提示账户信息的,想法,它会从基于当前登录用户的操作系统提取必要的详细信息.使用Windwos身份验证协议来通信,能确保密码不会在网络中传递.
客户身份证书身份验证: 要求每个客户具有X509数字证书,每个证书会映射一个指定的Windows用户帐号,当一个客户发出请求时,该请求中会包含客户的证书.IIS验证该证书,并判断是哪个Windows用户发出的请求.


ASP.NET身份验证
Windows身份验证是依赖于IIS的.IIS会确保发出请求的用户具有一个有效的Windows账户,并向ASP.NET应用程序传递验证后的用户信息.之后ASP.NET会根据自身的设置,对请求用户进行身份验证.
None: 如果没有打算使用ASP.NET应用程序来实现用户身份验证机制,可以使用如下配置文件来关闭ASP.NET身份验证,
<configuration>
     <system.web>
          <authentication mode="None">
     </system.web>
</configuration>

Windows身份验证:启动Windows身份验证之后,设置ASP.NET应用程序主体为System.Security.Principal.WindowsPrincipal的一个实例,而配置System.Security.Principal.WindowsPrincipal是为了代表验证后的Windows用户.可以以如下方式启动Windows身份验证:
<configuration>
     <system.web>
          <authentication mode="Windows">
     </system.web>
</configuration>

表单身份验证:Windows身份验证要求ASP.NET应用程序用户具有Windows用户账户, 这对基于Web和跨平台的应用程序而言并不合适.表单验证允许实现用户身份验证机制.此时可以验证被授权的任意用户.注意使用表单验证之前,IIS需要设置为匿名验证,否则IIS会强行验证所有用户.这个并不难理解.
表单身份验证的过程大致如下, 首先是客户想ASP.NET应用程序发出资源请求,ASP.NET会在客户请求中检查身份验证cookie,如果没有发现cookie, 把客户定向到登录页面. 让用户提交凭据,如果凭据有效,则进入访问资源,并创建一个身份验证cookie. 身份验证的配置如下:
  <authentication mode="Forms">
        <forms name="ProgDotNetSecurity" loginUrl="Logon.aspx" protection="All" timeout="10" path="/" requireSSL="false" slidingExpiration="true">
         <credentials passwordFormat="Clear">
          <user name="Tom" password="1234"/>
         </credentials>
        </forms>
  </authentication>
  <authorization>
       <deny users="?"/>
  </authorization>

授权

授权能够控制验证后的标识是否能访问它请求的资源.ASP.NET提供了两种授权机制:文件授权和URL授权.
文件授权: 当启动ASP.NET Windows身份验证时,就会自动强制执行文件授权,而且不能禁止或配置文件授权.在IIS身份验证用户之后且在ASP.NET处理应用程序进程的请求之前,ASP.NET会检查:身份验证后的用户是否具有必要的NTFS权限来访问被请求的资源.如果具备权限,ASP.NET就会处理应用程序进程的请求,否则,拒绝请求.
URL授权: 当没有使用Windows验证时,URL验证也是控制访问资源的一种有效机制,URL授权设置是包含在ASP.NET应用程序配置文件里的,可以使用<location>配置元素将URL授权配置到任意级别.URL授权允许授予资源权限或拒绝访问权限,这些资源都是以当前主体的标识和角色为基础的,也可以限制基于HTTP操作类型的访问,如GET或POST. 具体实现方式如下:
<configuration>
  <system.web> 
     <authorization>
       <deny users="?"/>
       <allow users="Alice,Bob"/>
       <deny users="Eve"/>
       <deny roles="Administrator, Managers,Developers"/>
       <deny verbs="POST" roles="Users"/>
       <deny users="*"/>
     </authorization>
  </system.web>
</configuration>
当授权访问资源时,ASP.NET会一直搜索知道它找到第一个<allow>或<deny>元素为止,可以将这些元素应用于当前标识,所以这些元素的顺序是很重要的. 同时,本实例中还包含两种特殊字符: "?"标识所有没有进行身份验证的用户,注意身份验证是在Authentication中定义的.这里是授权设置."*"表示所有的用户.

posted on 2009-03-18 14:01  blue-boy  阅读(283)  评论(0编辑  收藏  举报

导航