配置概述:ASP.NET
本文档主要介绍ASP.NET应用程序的配置及其安全性设置。
目录
- 引言
- ASP.NET多层配置系统
- 重要的配置标签
- <authentication>
- <authorization>
- <compilation>
- <customErrors>
- <globalization>
- <httpRuntime>
- <trace>
- <identity>
- <sessionState>
- <appSettings>
- 自定义配置节
- 加密配置节
- 几个要点
- 延伸阅读
引言
本文将探讨网站的配置文件。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使用配置继承,以便每个子目录都继承父目录的设置。
举个例子。我们有一个Web请求https:///X/Y/Z/page.aspx,其中X是应用程序的根目录。在这种情况下,将涉及多个级别的设置。
- 首先应用默认的machine.config设置。
- 接下来,应用根级别的web.config。此web.config文件与machine.config文件位于同一配置目录中。
- 现在,如果应用程序根目录X中有任何配置文件,则将应用这些设置。
- 如果子目录Y中有任何配置文件,则现在将应用这些设置。
- 如果应用程序根目录Z中有任何配置文件,则将应用这些设置。
但是这里有一个限制:我们可以有无限数量的具有不同设置的子目录,但步骤1和2中的配置更为重要,因为有些设置无法覆盖,例如用于执行代码的Windows帐户,而其他设置只能在应用程序根级别覆盖,例如要使用的身份验证类型等。
当我们将不同的安全设置应用于不同的文件夹时,不同的配置文件很有用。需要保护的文件将被放置在单独的文件夹中,并带有单独的web.config文件,该文件为这些文件定义了更严格的安全设置,反之亦然。
在web.config中,在<configuration>
元素下,有一个名为<system.web>
的元素,用于ASP.NET设置,并为配置的每个方面包含单独的元素。
重要的配置标签
web.config文件提供了许多配置标签,例如authentication
、authorization
、browserCaps
、clientTarget
等,但并非所有这些都具有同等的重要性(也无法在一篇文章中涵盖),因此这里我只关注了配置文件中的主要标签。
<authentication>
当客户端从服务器请求页面时,此元素用于验证客户端的身份。此设置在应用程序级别。我们有四种身份验证模式:“None
”、“Windows
”、“Forms
”和“Passport
”。
如果我们不需要任何身份验证,则使用此设置。
<authentication mode="None"/>
通常使用Windows身份验证,为此,我们需要选中复选框:“集成Windows身份验证”。
<authentication mode="Windows"/>
此身份验证由IIS处理。当用户向服务器发送请求时,IIS会对其进行身份验证,并将身份验证信息发送到代码。
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>
在此部分,我们可以配置编译器的设置。在这里,我们可以拥有许多属性,但最常见的属性是debug
和defaultLanguage
。将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
组件来解析它们,并将它们用作键/值对,以便在运行时访问。
这可以很容易地从代码隐藏中读取,如下所示:
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配置”。