65.9K
CodeProject 正在变化。 阅读更多。
Home

配置概述:ASP.NET

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.80/5 (37投票s)

2009年1月15日

CPOL

12分钟阅读

viewsIcon

91820

本文档主要介绍ASP.NET应用程序的配置及其安全性设置。

目录

引言

本文将探讨网站的配置文件。ASP.NET网站配置通常由两个文件组成:

  • machine.config
  • web.config

在这里,我将重点介绍web.config,并概述machine.config

每次安装.NET Framework时,都会在“C:\WINDOWS\Microsoft.NET\Framework\[Version]\CONFIG”下创建一个machine.config文件,该文件主要定义:

  • 支持的配置文件节,
  • ASP.NET工作进程配置,以及
  • 注册用于配置文件、成员资格和基于角色的安全等高级功能的各种提供程序。

研究web.config可能需要一本书,但在这里,我将尝试探讨对ASP.NET网站及其部署起关键作用的所有重要部分。

每个Web应用程序都继承machine.config文件的设置,而应用程序级别的设置在web.config文件中完成。我们也可以在web.config文件中覆盖machine.config文件中的配置。但是,某些设置无法覆盖,因为某些设置是进程模型设置,无法按应用程序进行更改。

无论配置文件是machine.config还是web.config,其全部内容都嵌套在<configuration>元素中。

ASP.NET多层配置系统

ASP.NET使用多层配置系统,允许为应用程序的不同部分使用不同的设置。为此,我们必须在虚拟目录中有一个额外的子目录,这些子目录将包含其自己的具有附加设置的配置文件。ASP.NET使用配置继承,以便每个子目录都继承父目录的设置。

config1.jpg

举个例子。我们有一个Web请求https:///X/Y/Z/page.aspx,其中X是应用程序的根目录。在这种情况下,将涉及多个级别的设置。

  1. 首先应用默认的machine.config设置。
  2. 接下来,应用根级别的web.config。此web.config文件与machine.config文件位于同一配置目录中。
  3. 现在,如果应用程序根目录X中有任何配置文件,则将应用这些设置。
  4. 如果子目录Y中有任何配置文件,则现在将应用这些设置。
  5. 如果应用程序根目录Z中有任何配置文件,则将应用这些设置。

但是这里有一个限制:我们可以有无限数量的具有不同设置的子目录,但步骤1和2中的配置更为重要,因为有些设置无法覆盖,例如用于执行代码的Windows帐户,而其他设置只能在应用程序根级别覆盖,例如要使用的身份验证类型等。

当我们将不同的安全设置应用于不同的文件夹时,不同的配置文件很有用。需要保护的文件将被放置在单独的文件夹中,并带有单独的web.config文件,该文件为这些文件定义了更严格的安全设置,反之亦然。

web.config中,在<configuration>元素下,有一个名为<system.web>的元素,用于ASP.NET设置,并为配置的每个方面包含单独的元素。

重要的配置标签

web.config文件提供了许多配置标签,例如authenticationauthorizationbrowserCapsclientTarget等,但并非所有这些都具有同等的重要性(也无法在一篇文章中涵盖),因此这里我只关注了配置文件中的主要标签。

<authentication>

当客户端从服务器请求页面时,此元素用于验证客户端的身份。此设置在应用程序级别。我们有四种身份验证模式:“None”、“Windows”、“Forms”和“Passport”。

如果我们不需要任何身份验证,则使用此设置。

<authentication mode="None"/>

通常使用Windows身份验证,为此,我们需要选中复选框:“集成Windows身份验证”。

<authentication mode="Windows"/>

此身份验证由IIS处理。当用户向服务器发送请求时,IIS会对其进行身份验证,并将身份验证信息发送到代码。

config2.jpg

IIS为身份验证模式提供了四种选择:匿名、基本、摘要式和Windows集成。如果用户选择匿名,则IIS不执行任何身份验证。对于基本身份验证,用户必须提供用户名和密码。此身份验证非常不安全,因为用户凭据以纯文本格式在网络上传输。摘要式身份验证与基本身份验证相同,只是它会哈希用户的密码并在网络上传输哈希版本。因此,它比基本身份验证更安全。对于Windows集成身份验证,密码永远不会在网络上传输。用户仍必须具有用户名和密码,但应用程序使用Kerberos或质询/响应协议来验证用户。

表单身份验证使用Web应用程序表单收集用户凭据,并根据凭据在Web应用程序上采取行动。

<authentication mode="Forms">
  <forms name="Form" loginUrl="index.asp" />
</authentication>

Passport身份验证由Microsoft提供。应指定一个重定向URL,当请求的页面未经验证时使用该URL,然后它会重定向到此URL。

<authentication mode="Passport">
  <passport redirectUrl="internal" />
</authentication>

在这里,用户使用Microsoft的Passport数据库中的信息进行身份验证。优点是我们可以使用现有的用户凭据(如电子邮件地址和密码),而无需强迫用户进行单独的注册过程。缺点是我们需要通过Microsoft的许可协议,并根据使用情况支付年度费用。

要使用Passport身份验证,首先在服务器上安装Passport软件开发工具包(SDK)。SDK可以从此处下载。它包含了在您自己的应用程序中实现Passport身份验证的完整详细信息。

<authorization>

<authorization>标签控制客户端对Web页面资源的访问。此元素可以在任何级别(计算机、站点、应用程序、子目录或页面)声明。

<authorization>
  <allow users="comma-separated list of users"
         roles="comma-separated list of roles"
         verbs="comma-separated list of verbs"/>
  <deny users="comma-separated list of users"
         roles="comma-separated list of roles"
         verbs="comma-separated list of verbs"/>
</authorization>

<allow>:使用此标签,我们可以根据以下动词控制对资源的访问。在这些属性中,我们使用符号:?和*。?表示匿名用户/资源,*表示所有用户。

  • users:包含允许访问资源的用户名列表(逗号分隔)。
  • roles:包含允许访问角色的角色列表(逗号分隔)。
  • verbs:包含动作适用的HTTP动词列表(逗号分隔)。它用于创建应用于特定类型HTTP请求(GET、POST、HEAD或DEBUG)的规则。

<deny>:使用此标签,我们可以根据以下动词控制对资源的访问。

  • users:包含不允许访问资源的用户名列表(逗号分隔)。
  • roles:包含不允许访问角色的角色列表(逗号分隔)。
  • verbs:包含动作适用的HTTP动词列表(逗号分隔)。它用于创建应用于特定类型HTTP请求(GET、POST、HEAD或DEBUG)的规则。

<compilation>

在此部分,我们可以配置编译器的设置。在这里,我们可以拥有许多属性,但最常见的属性是debugdefaultLanguage。将debug设置为true意味着我们希望在浏览器中显示调试信息,但这会影响性能,因此通常将其设置为false。而defaultLanguage告诉ASP.NET使用哪种语言编译器:VB或C#。

<customErrors>

此标签包含应用程序的错误设置,用于向最终用户提供自定义错误页面(用户友好的错误页面)。如果发生错误,网站将重定向到默认URL。要启用和禁用自定义错误,我们需要指定mode属性。

<customErrors defaultRedirect="url" mode="Off">
  <error statusCode="403" redirect="/accesdenied.html" />
  <error statusCode="404" redirect="/pagenotfound.html" />
</customErrors>
  • “On”表示此设置已启用,如果发生任何错误,网站将重定向到默认URL。
  • “Off”表示已禁用自定义错误。
  • “RemoteOnly”表示自定义错误仅显示给远程客户端。
  <error statusCode="403" redirect="/accesdenied.html" />
  <error statusCode="404" redirect="/pagenotfound.html" />

这意味着如果发生403错误,网站将重定向到自定义页面accessdenied.html。同样,对于404,如上所述。

注意:如果自定义错误页面本身发生错误,ASP.NET将无法处理。它不会尝试将用户重新导向到同一页面。相反,它将显示带有通用消息的正常默认客户端错误页面。.

<globalization>

当我们要使用编码或为应用程序指定文化时,使用此部分。这是一个非常广泛的主题,可以单独写一篇文章来解释。在这里,我们定义了服务器发送响应给客户端的字符集(默认为UTF-8),以及服务器应使用哪些设置来解释和显示特定于文化(如数字和日期)的字符串。

<globalization requestEncoding="utf-8" responseEncoding="utf-8" />

<httpRuntime>

此部分可用于配置应用程序的常规运行时设置。主要有两个:

<httpRuntime appRequestQueueLimit="50" executionTimeout="300" />

顾名思义,appRequestQueueLimit属性定义了服务器上可用于处理的请求队列数量。如果有51个或更多请求,服务器将返回503错误(“服务器太忙”)。

executionTimeout属性定义了ASP.NET处理请求的时间(分钟),直到超时。

<trace>

顾名思义,它用于跟踪应用程序的执行。这里我们有两种级别的跟踪:页面级别和应用程序级别。应用程序级别会启用应用程序中每个可用页面的执行跟踪日志。如果pageOutput="true",跟踪信息将显示在每个页面的底部。否则,我们可以在应用程序根文件夹下的trace.axd文件中查看跟踪日志。

<trace enabled="false" requestLimit="10" pageOutput="false" 
       traceMode="SortByTime" locaOnly="true" />

localOnly属性设置为false以不从客户端查看跟踪信息。

要启用页面级别的跟踪,请在Page标签(页面顶部)中设置Trace="True"

<identity>

使用此标签,我们可以控制应用程序的身份。默认情况下,Impersonation是禁用的。通过使用Impersonation,ASP.NET应用程序可以选择性地以其操作对象的客户端的身份执行。

<identity impersonate="false" userName="domain\username" password="password" />

<sessionState>

在此部分,我们告诉ASP.NET将会话存储在哪里。默认情况下,它是inproc,表示在服务器上存储会话值。但我们有四种选择:

  • Off”表示会话未为应用程序启用。
  • inproc”表示在服务器上存储会话值。
  • StateServer”表示会话状态存储在远程服务器上。
  • SQLServer”表示会话状态存储在SQL Server数据库中。为此,我们需要在SQL Server数据库中安装InstallSQLState.sql脚本。它主要用于使用Web场(部署在多个服务器上的应用程序),但与“inproc”相比,性能会变慢。

以下是其他设置:

  • cookieless”:当它为true时,表示使用的会话不带Cookie。
  • timeout”指定如果在此期间未访问应用程序,会话将在多长时间后过期。
  • 当会话模式为StateServer时,需要指定“stateConnectionString”。
  • 如果会话模式为sqlserver,则“sqlConnectionString”是SQL Server数据库的连接字符串。
  • 使用StateServer模式存储会话状态时,“stateNetworkTimeout”属性指定Web服务器和状态服务器之间的TCP/IP网络连接可以空闲多少秒,然后会话将被放弃。默认值为10。
<sessionState mode="Off" 
     cookieless="true" 
     timeout="100" 
     stateConnectionString="tcpip=server:port" 
     sqlConnectionString="sql connection string"
     stateNetworkTimeout="number of seconds"/>

<appSettings>

此部分用于存储自定义应用程序配置,如数据库连接字符串、文件路径等。它还可以用于自定义应用程序范围的常量,以在多个页面中存储信息。这取决于应用程序的要求。

<appSettings>
    <add key="Emailto" value="me@microsoft.com" />
    <add key="cssFile" value="CSS/text.css" />
</appSettings>

它可以通过代码访问,如下所示:

ConfigurationSettings.AppSettings("Emailto");

从它返回的所有值都是字符串。

自定义配置节

根据需求,我们可能需要一些自定义配置节。最简单的方法之一是创建我们自己的命名节,并可以使用现有的NameValueSectionHandler组件来解析它们,并将它们用作键/值对,以便在运行时访问。

config14.gif

这可以很容易地从代码隐藏中读取,如下所示:

private string ReadCustomSection()
{
    string strKey = "mySectionKey1";
    NameValueCollection nvcmySection = (NameValueCollection)
       ConfigurationSettings.GetConfig("mySection");
    string strValueofKey = nvcmySection[strKey];
    return strValueofKey;
}

还有更多使用自定义配置节的方法。请查看本文:CustomConfigurationSection

加密配置节

有时,我们会将一些敏感数据(如连接字符串、用户特定详细信息等)放在web.config文件中。建议加密这些节。ASP.NET支持两种加密技术。

  • RSA
  • DPAPI

操作执行方式非常简单。从配置文件检索信息时,ASP.NET会自动解密它并将纯文本提供给代码。同样,如果我们从代码中更新配置文件,则按相同方式进行。我们不能直接更新配置文件。但是,我们可以使用WAT进行更新。

编程加密技术:如果我们想以编程方式进行加密,则需要检索相应的ConfigurationSection.SectionInformation对象并调用ProtectSection()方法。如果我们要解密一个节,则可以调用UnprotectSetion()方法。下面是示例代码:

Configuration myConfig = 
  WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
ConfigurationSection mySettings = myConfig.GetSection("mySection");
if (mySettings.SectionInformation.IsProtected)
{
    mySettings.SectionInformation.UnprotectSection();
}
else
{
    mySettings.SectionInformation.ProtectSection("DataProtectionConfigurationProvider"); ;
}
myConfig.Save();

命令行实用程序:我们还可以使用命令行实用程序,如aspnet_regiis.exe来加密配置文件,这是一个CAB文件,位于C:\[WinDir]\Microsoft.NET\Framework\[Version]。要使用此工具,我们必须为应用程序创建一个虚拟目录。有关更多信息,请参阅我的文章在IIS上部署网站

在使用aspnet_regiis保护配置文件的一些节时,我们需要指定一些命令行参数,例如:

  • -pe开关指定要加密的配置节。
  • -app开关指定我们的Web应用程序虚拟路径。
  • -prov开关指定提供程序名称。

以下是位于https:///MyApp的应用程序的命令行:

几个要点

  • 某些设置无法加密,因为它们在ASP.NET外部使用(主要由IIS Web服务器使用),例如<httpruntime>
  • 配置文件区分大小写。
  • web.config文件受到IIS的保护,因此客户端系统无法访问它。所以,如果用户尝试访问它,将显示“访问被拒绝”消息。
  • 如果我们更改服务器上的配置文件,则无需重新启动Web服务器,因为IIS会监视web.config中的更改,并出于性能考虑,它会缓存它。
  • Microsoft还提供了一个名为网站管理工具(WAT)的工具,该工具允许我们通过Web界面配置web.config的各个部分。要运行它,请在Visual Studio中选择“网站”->“ASP.NET配置”。

延伸阅读

© . All rights reserved.