您的位置:首页 > 编程语言

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

2009-03-18 14:01 295 查看
ASP.NET配置文件

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

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

<configuration>

<location/>

<system.web>

<authentication/>

<authorization/>

<identity/>

<machineKey/>

<processMode/>

<securityPolicy/>

<trust/>

</system.web>

</configuration>
详细介绍如下:

<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中定义的.这里是授权设置."*"表示所有的用户.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: