ASP.NET 配置文件相关
可扩展的基础结构是 ASP.NET 配置系统的一大特色,该基础结构使您可以在最初部署 ASP.NET 应用程序时定义配置设置,以便可以随时添加或修改这些配置设置,同时对运作着的 Web 应用程序和服务器产生的影响也将被减至最小。
ASP.NET 配置系统提供以下好处:
配置信息存储在基于 XML 的文本文件中。您可以使用任何标准的文本编辑器或 XML 分析器来创建和编辑 ASP.NET 配置文件。
多个配置文件(名称都是 Web.config)可以出现在 ASP.NET Web 应用程序服务器上的多个目录中。每个 Web.config 文件都将配置设置应用于它自己的目录和它下面的所有子目录。子目录中的配置文件可以提供除从父目录继承的配置信息以外的配置信息,子目录配置设置可以重写或修改父目录中定义的设置。名为 systemroot\Microsoft.NET\Framework\versionNumber\CONFIG\Machine.config 的根配置文件提供整个 Web 服务器的 ASP.NET 配置设置。
在运行时,ASP.NET 使用分层虚拟目录结构中 Web.config 文件提供的配置信息为每个唯一的 URL 资源计算一组配置设置。然后缓存结果配置设置,以供所有后面的对资源的请求使用。请注意,继承是由传入请求路径 (URL) 定义的,而不是到磁盘上资源的文件系统路径(物理路径)定义的。
ASP.NET 检测对配置文件的更改并自动将新配置设置应用于受该更改影响的 Web 资源。不需要重新启动服务器让更改生效。只要层次结构中的配置文件被更改,就将自动重新计算并重新缓存分层配置设置。<processModel> 节例外。
ASP.NET 配置系统是可以扩展的。您可以定义新配置参数并编写配置节处理程序以对它们进行处理。
ASP.NET 通过配置 Internet 信息服务 (IIS) 防止对配置文件的直接浏览器访问来保护配置文件不受外部访问。向任何试图直接请求配置文件的浏览器返回 HTTP 访问错误 403(禁止)。
ASP.NET 资源的配置信息包含在一组配置文件中,每个文件都名为 Web.config。每个配置文件都包含 XML 标记和子标记的嵌套层次结构,这些标记带有指定配置设置的属性。因为这些标记必须是格式正确的 XML,所以标记、子标记和属性是区分大小写的。标记名和属性名是 Camel 大小写形式的,这意味着标记名的第一个字符是小写的,任何后面连接单词的第一个字母是大写的。属性值是 Pascal 大小写形式的,这意味着第一个字符是大写的,任何后面连接单词的第一个字母也是大写的。true 和 false 例外,它们总是小写的。
所有配置信息都驻留在 <configuration> 和 </configuration> 根 XML 标记之间。标记间的配置信息分为两个主区域:配置节处理程序声明区域和配置节设置区域。
配置节处理程序声明出现在配置文件顶部 <configSections> 和 </configSections> 标记之间。包含在 <section> 标记中的每个声明都指定提供特定配置数据集的节的名称和处理该节中配置数据的 .NET Framework 类的名称。
配置节设置区域位于 <configSections> 区域之后,它包含实际的配置设置。<configSections> 区域中的每个声明都有一个配置节。每个配置节都包含子标记,这些子标记带有包含该节设置的属性。
下面的 Web.config 文件示例声明两个配置 <section> 处理程序。一个管理应用程序设置,另一个管理会话状态。
<configuration>
<configSections>
<section name="appSettings"
type="System.Configuration.NameValueFileSectionHandler,
System, Version=1.0.3300.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<section name="sessionState"
type="System.Web.SessionState.SessionStateSectionHandler,
System.Web, Version=1.0.3300.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a"
allowDefinition="MachineToApplication"/>
</configSections>
<appSettings>
<add key="dsn" value="localhost;uid=MyUserName;pwd=;"/>
<add key="msmqserver" value="server\myqueue"/>
</appSettings>
<sessionState cookieless="true" timeout="10"/>
</configuration>
您只需要声明配置节处理程序一次。您可以将其放置在服务器的根 Machine.config 文件中或包含 Web 应用程序文件的虚拟目录的 Web.config 文件中。子目录中的配置文件自动继承父目录中声明的配置处理程序。有关更多信息,请参见配置继承。
配置设置在节分组标记下经常嵌套在一起。这些顶级节标记通常表示配置设置应用到的命名空间。例如,顶级 <system.net> 标记表示网络类的设置,<system.web> 标记表示 ASP.NET 类的设置。
配置 <location> 设置
通过使用具有适当的 path 属性的 <location> 标记,可以将配置设置应用于特定的资源。path 属性可用于标识对其应用唯一配置设置的特定的文件或子目录。
例如,下面的配置文件在三个级别指定设置:
应用于当前目录和所有子目录的设置(全部内容包含在顶部 <configuration> 标记中)。
应用于 Sub1 子目录的设置(全部内容包含在 <location> 标记中,路径属性设置为 Sub1)。
应用于 Sub2 子目录的设置(全部内容包含在 <location> 标记中,路径属性设置为 Sub2)。
<configuration>
<system.web>
<sessionState cookieless="true" timeout="10"/>
</system.web>
<!— Configuration for the "Sub1" subdirectory. -->
<location path="sub1">
<system.web>
<httpHandlers>
<add verb="*" path="Sub1.Scott" type="Sub1.Scott"/>
<add verb="*" path="Sub1.David" type="Sub1.David"/>
</httpHandlers>
</system.web>
</location>
<!— Configuration for the "Sub2" subdirectory. -->
<location path="sub2">
<system.web>
<httpHandlers>
<add verb="*" path="Sub2.Scott" type="Sub2.Scott"/>
<add verb="*" path="Sub2.David" type="Sub2.David"/>
</httpHandlers>
</system.web>
</location>
</configuration>
访问 ASP.NET 配置设置
您可以从 ASP.NET 应用程序使用 ASP.NET 公开的内部静态方法来访问公共配置设置。例如,若要读取 <sessionState> 节 cookieless 属性的值,您可以使用下面的代码行。
[Visual Basic]
Dim nocookies As Boolean = Session.IsCookieless
[C#]
bool nocookies = Session.IsCookieless;
可以使用 ConfigurationSettings.AppSettings 静态字符串集合来访问 Web.config 文件顶级 <appSettings> 节中存储的应用程序特定的设置。例如:
[Visual Basic]
Dim dsn As String = ConfigurationSettings.AppSettings("dsn")
[C#]
String dsn = ConfigurationSettings.AppSettings["dsn"];
创建新的配置节
您可以用自己的 XML 配置标记扩展标准的 ASP.NET 配置设置集。若要完成该操作,您必须创建自己的配置节处理程序。该处理程序必须是一个实现 IConfigurationSectionHandler 接口的 .NET Framework 类。节处理程序解释并处理 Web.config 文件特定部分中 XML 标记中定义的设置并根据配置设置返回适当的配置对象。处理程序类返回的配置对象可以是任何数据结构;它不限于任何基配置类或配置格式。
下面的示例定义 IConfigurationSectionHandler 接口。
[Visual Basic]
Namespace System.Web.Configuration
Public Interface IConfigurationSectionHandler
Function Create(parent As Object, input As Object, _
node As XmlNode) As Object
End Interface
End Namespace
[C#]
namespace System.Web.Configuration
{
public interface IConfigurationSectionHandler
{
public Object Create(Object parent, Object input,
XmlNode node);
}
}
您还可以定义自己的节,该节与 <appSettings> 节使用相同的配置处理程序。例如:
<configuration>
<configSections>
<sectionGroup name="myGroup">
<sectionGroup name="nestedGroup">
<section name="mySection" type=
"System.Configuration.NameValueSectionHandler,System"/>
</sectionGroup>
</sectionGroup>
</configSections>
<myGroup>
<nestedGroup>
<mySection>
<add key="key_one" value="1"/>
<add key="key_two" value="2"/>
</mySection>
</nestedGroup>
</myGroup>
</configuration>
您可以读取上面的示例中定义的新配置节的值,如下:
[Visual Basic]
Dim config As NameValueCollection =
ConfigurationSettings.GetConfig("myGroup/nestedGroup/mySection")
Response.Write("The value of key_one is " & config("key_one") & "<br>")
Response.Write("The value of key_two is " & config("key_two") & "<br>")
[C#]
NameValueCollection config = (NameValueCollection)
ConfigurationSettings.GetConfig("myGroup/nestedGroup/mySection");
Response.Write("The value of key_one is " + config["key_one"] + "<br>");
Response.Write("The value of key_two is " + config["key_two"] + "<br>");
部署 ASP.NET Web 应用程序
部署 ASP.NET 应用程序非常简单。只需将所创建的应用程序文件从开发计算机复制到将承载应用程序的成品 Web 服务器。可以使用 XCOPY 命令行工具或喜欢的 FTP 应用程序,将文件从一个位置复制到另一个位置。
要部署希望在 Web 应用程序间共享的程序集(比如包含自定义 ASP.NET 服务器控件的程序集),应将其部署到全局程序集缓存。
全局程序集缓存我在这里简单介绍一下:
复制内容到剪贴板
代码:
安装有公共语言运行库的每台计算机都具有称为全局程序集缓存的计算机范围内的代码缓存。全局程序集缓存中存储了专门指定给由计算机中若干应用程序共享的程序集。
应当仅在需要时才将程序集安装到全局程序集缓存中以进行共享。一般原则是:程序集依赖项保持专用,并在应用程序目录中定位程序集,除非明确要求共享程序集。另外,不必为了使 COM interop 或非托管代码可以访问程序集而将程序集安装到全局程序集缓存。
注意 在有些情况下,您显然不希望将程序集安装到全局程序集缓存中。如果您将组成应用程序的某个程序集置于全局程序集缓存中,则将不再能够通过使用 xcopy 命令复制应用程序目录来复制或安装该应用程序。您还必须在全局程序集缓存中移动该程序集。
有若干方法可以将程序集部署到全局程序集缓存中:
使用专用于全局程序集缓存的安装程序。该方法是将程序集安装到全局程序集缓存的首选方法。
使用 .NET Framework SDK 所提供的名为全局程序集缓存工具 (Gacutil.exe) 全局程序集缓存工具使您可以查看和操作全局程序集缓存和下载缓存的内容。gacutil [options] [assemblyName | assemblyPath | assemblyListFile]的开发人员工具。
使用 Windows 资源管理器将程序集拖到缓存中。
从命令行部署 ASP.NET 应用程序
单击“开始”,然后单击“运行”。
在“运行”对话框的“打开”文本框中,输入“cmd”,然后单击“确定”。
在命令提示处,键入下列命令:
xcopy <源路径> <目标路径>
在此命令中,<源路径> 是需要复制的源文件的完整路径,包括驱动器、目录和要复制的文件名。如果目录下的全部文件都需要复制,可以省略文件名。<目标路径> 是文件应该复制到的目录的完整路径。
以下的命令示例将 c:\myWebApp 目录下的所有文件复制到 d:\liveapp 目录下。
xcopy c:\devapp d:\liveapp
回答所有关于所复制的文件或目录的问题。
当需要更新应用程序的 \Bin 目录下存储的 DLL 或更新任何其他应用程序文件时,都可以使用此过程。下面的示例将一个驱动器的 \bin 目录中的一个 DLL 复制到另一个驱动器的 \bin 目录下。
xcopy c:\devapp\bin\myAssembly.dll d:\liveapp\bin\
同样,一旦部署了应用程序,就可以使用此命令更新应用程序中的文件。虽然可以复制整个目录,但是在复制个别文件时,在两个目录之间一次只能复制一个文件。可以使用 XCOPY /exclude 选项,从复制中排除子目录、带指定文件扩展名的文件或具体的文件名。有关如何使用 XCOPY 工具的更多信息,请打开操作系统的文档并搜索 XCOPY。
注意 对于 XCOPY 工具必须使用物理目录名。不能使用虚拟目录名。
Visual Studio 中设计时的 Web 应用程序安全性
当您在 Visual Studio 中工作以创建 Web 应用程序时,将需要在开发过程中访问一些资源,与这种访问相关的安全性存在一些特定的要求。这些要求不同于那些适用于应用程序用户的要求。设计时的安全性要求包括:
访问您的工作服务器、数据库服务器以及其他属于应用程序一部分的资源。
您选择了哪种 Web 访问方法(您如何向 Web 服务器传输数据)。
以完全受信任模式运行代码。
调试。
部署您的应用程序。
访问开发资源
为了在 Visual Studio 中创建和测试 Web 应用程序,您必须能够访问运行 Internet 信息服务 (IIS) 的计算机。在此服务器(即开发服务器,它不同于您在其中部署应用程序的生产服务器)上,必须具有某些最低程度的特权,其中包括能够将文件写入服务器并运行这些文件。
Web 服务器不必位于用于开发的同一台计算机上。但是,您必须至少在 Web 服务器上安装 Visual Studio 的服务器组件,以使其支持应用程序的调试和部署。
对资源的设计时访问通常使用 Windows NT 身份验证来处理,也就是说,作为开发人员,您使用自己的网络登录凭据来获取对所需资源的访问权。当 Visual Studio 安装完毕后,它会在服务器上创建一个名为“VS Developers”(VS 开发人员)的组。该组具有在此计算机上开发 Web 项目所必需的全部文件、共享和 IIS 权限。(计算机管理员可以进一步为该组配置自定义权限,但这并不是必需的。)作为开发人员,您必须作为个人或您所属的另一个组的成员成为该组的成员。授予“VS Developers”(VS 开发人员)组的特定权限有:
访问 Web 服务器计算机的 wwwroot 目录的权限。
创建、修改和执行 Web 目录中文件的权限。
调试远程 Web 应用程序的权限。
安全说明 开发人员并不需要为使用某服务器进行开发而具有该服务器的管理员权限。(但是,所有开发人员都必须是“VS Developers”(VS 开发人员)组的成员。)如果向开发人员授予不必要的管理员权限,则可能会给网络造成安全性风险。
如果您的应用程序需要访问进一步的资源,您必须同样地作为个人或作为组的成员建立对这些资源的访问权限。一个典型的示例就是 SQL Server。作为 Web 应用程序开发人员,您将需要能够读取(并在可能时更新)应用程序所需的数据库表。对于某些方案,您还需要具有将存储过程写入服务器的权限;在其他方案中,则可能需要具有添加、改变或删除表的权限。
Web 访问方法
Visual Studio 允许您以两种方式访问 Web 应用程序项目:
使用文件共享访问(UNC 访问)。在这种方式中,Visual Studio 使用基于 Windows 的文件管理命令将文件复制到服务器上。
使用 FrontPage 服务器扩展访问。在这种方式中,将使用 HTTP 来传输文件。
文件共享访问要求您与 Web 服务器位于同一域中。实际上,这意味着您只能在自己的网络上使用文件共享访问。
对比之下,FrontPage 访问允许跨越防火墙创建和管理应用程序(只要防火墙传递 HTTP 请求)。这样,就可以通过 Internet 执行操作(当然也可以在您首选 HTTP 访问的本地设置中执行操作)。
这两种访问方法仍然要求使用 Visual Studio 服务器组件、“VS Developers”(VS 开发人员)组等正确配置服务器。同样,您仍然需要在服务器上具有足够的特权才能创建、编写和运行文件。
以完全受信任模式运行代码
当 Visual Studio 运行时,设计器在设计时运行的用户代码将始终以完全受信任模式运行。即使该代码最终部署到的环境将以限制较大的安全性来运行,情况也是如此。这包括两层含义:
可能会因为将不安全代码导入项目而给本地计算机带来安全性风险。由于 Visual Studio 以完全受信任模式运行,导入的代码会从 Visual Studio 继承其权限,而不安全的代码将作为安全代码来运行。只有在恶意用户创建具有破坏性的代码段(例如自定义控件),而您随后因疏忽导入并运行该代码段的情况下,才需要注意这一问题。因此,在将代码导入项目时,务必要加倍小心。
您在 Visual Studio 中创建的应用程序可能会在部署后无法正确运行,因为该代码是在不同的安全性上下文中运行。
调试
调试要求您能够附加到在本地计算机(如果 Web 服务器位于另一台计算机上,则为远程计算机)上运行的进程。调试要求您使用“管理员”特权运行。如果您是在远程计算机上进行调试,则必须在本地计算机上和远程计算机上都具有相应的权限。
当 Visual Studio 安装完毕后,它将创建一个名为“Debugger Users”(调试器用户)的组,该组具有进行调试所必需的权限。通过将开发人员和调试用户划分到不同的组,服务器管理员可以向一个经过精选的组授予调试所必需的特权,而不是向所有使用 Visual Studio 的用户授予这些特权。
安全说明 “Debugger Users”组中的成员可有效地授予用户管理级别特权。不要使不应具有这种级别特权的任何人成为此组的成员。
部署应用程序
当完成应用程序后,您必须能够将它部署到生产服务器。如果生产服务器不属于您,则对该服务器的访问可能会受到很多在您的开发服务器上没有的限制。
部署 Web 应用程序的一种方法是使用 Visual Studio 部署工具。这种部署允许您执行应用程序的完全安装(包括注册和配置)。但是,它要求您对承载 Web 服务器的计算机具有管理员权限。
此外,如果生产服务器上安装有 FrontPage 服务器扩展,您也可以选择通过 HTTP 使用 Copy Project 命令来进行部署。这种部署为您提供的部署功能较少,但却允许您跨越防火墙进行部署。为了将文件写入目标服务器,您仍然必须在该服务器上具有足够的特权。
运行时的 Web 应用程序安全性
身份验证
ASP.NET 支持通过以下方法对用户进行身份验证。其中几种方法与 IIS 身份验证相重叠。有关详细信息,请参见介绍 Web 应用程序安全性。
身份验证类型 说明
匿名访问 用于未知用户将在其中发出请求的应用程序(通常是公共 Web 应用程序)。与 IIS 重叠。
基本和简要身份验证 (与 IIS 重叠)在此方案中,将提示无凭据的用户提供用户名和密码。
Windows 集成安全性 (NTLM) (与 IIS 重叠)如果发出请求的用户已经在基于 Windows 的网络中进行了身份验证,则在请求对资源的访问时,IIS 就可以通过该用户的凭据。
证书身份验证 (与 IIS 重叠)在此方案中,客户端具有已从第三方来源获取的证书(数字标识)。该证书通过请求传递到您的应用程序。
Kerberos (与 IIS 重叠)Kerberos 身份验证协议定义客户端与称作密钥分发中心 (Key Distribution Center, KDC) 的网络身份验证服务之间的交互。 Windows 2000 在每个域控制器上以身份验证服务的形式来实现一个 KDC。有关详细信息,请参见 Kerberos 协议的基本概念。
Forms 身份验证 如果需要对某用户进行身份验证,ASP.NET 则会将请求重定向到您指定的页。该页通常包含一个您要在其中获取用户名信息的窗体。(如需额外的安全性,可以使用 HTTPS 协议交换该窗体。)当应用程序获取窗体信息时,它可以对用户的凭据执行应用程序特定的检查。值得注意的是,身份验证进程在您的控制之下(与 IIS 不同),这使您能够指定窗体的外观并选择存储用户信息的方式。
如果某用户成功通过身份验证,ASP.NET 将颁发一个包含特定标记的加密 Cookie,该标记将为后继的访问标识该用户。
Passport 身份验证 利用 ASP.NET,您可以检查那些具有从符合 Microsoft Passport 的应用程序中获取的凭据的用户。
如果某用户成功通过身份验证,ASP.NET 将颁发一个包含特定标记的加密 Cookie,该标记将为后继的访问标识该用户。
在 ASP.NET 应用程序中,Forms 身份验证通常是最佳的选择,因此它使您能够在很大程度上控制如何对用户进行身份验证并允许您将身份验证存储在一个标记中。
XML Web services 安全性
XML Web services 使用 ASP.NET 并作为 Web 应用程序来运行,因此它们所参与的安全性模型与任何 ASP.NET 应用程序所参与的安全性模型都相同。例如,XML Web services 可能配置为使用基本身份验证或 Windows 集成安全性。
在设计时,当您尝试向 XML Web services 添加引用(即请求 XML Web services 的发现文档)时,该 XML Web services 将按照它的配置来执行标准的 Web 应用程序身份验证。例如,如果 XML Web services 配置为使用基本身份验证,该服务将需要从发出请求的客户端获取用户名和密码。在 Visual Studio 中,通常使用添加 Web 引用对话框来发现 XML Web services。例如,如果 XML Web services 使用的是基本身份验证,“添加 Web 引用”对话框将提示您提供凭据。
如果您正在生成的应用程序包含对 XML Web services 的调用,则需要确保在进行调用之前具有正确的凭据,否则该调用将会失败。在运行时,可以通过在调用 XML Web services 的方法之前设置表示 XML Web services 的客户端对象的 Credentials 属性来向 XML Web services 传递凭据。
由于其他 ASP.NET 安全性选项可能不够灵活,XML Web services 可以实现一种凭据信息在 SOAP 标头中进行传递的自定义身份验证解决方案。在该解决方案中,凭据在客户端和服务器之间交换的消息的可选部分进行传递。然后可以编写一个自定义的 HttpModule(实现 IHttpModule 接口),它可以侦听标头中的信息并调用您的身份验证代码。
与其他 ASP.NET 应用程序相同,XML Web services 可能会实现基于特定角色的授权,以限制对应用程序特定部分的访问。
建立 SSL 和加密
若要使用 SSL 和加密,必须获取您所在公司或标识的服务器证书。证书是一种数字签名,它标识您的站点,使其无法被模拟。对于 Internet(公共)应用程序,可以从公认的第三方证书颁发机构获取服务器证书。对于私有 (Intranet) 应用程序,您自己就可以颁发服务器证书。您这样做的目的可能是为了确保内部应用程序(如个人站点)的安全。
服务器证书还使您能够使用加密。SSL 使用一种称作“公钥加密”(public key encryption) 的加密方法。这种形式的加密机制中有两个密钥:公钥用于对数据进行加密;私钥由您密存,用于对用公钥加密的信息进行解密。您所获取的服务器证书包含一个公钥。当用户需要使用 SSL 时,您的应用程序将向浏览器发送证书和公钥。然后,浏览器和服务器使用公钥来建立一种对它们的信息交换进行加密的方式。
注意 若要使用 SSL,浏览器必须支持长度至少为 40 位的加密。大多数浏览器都提供这种级别的加密。
当获取服务器证书后,可以指示用户将 https:// 用作前缀来获取和发送 Web 页,以使用 SSL。IIS 和浏览器将自动使用加密信道来交换信息。