Visual Web Developer |
如何:使用数据源控件时保证连接字符串的安全性 (Visual Studio) |
请参见 |
使用数据源控件时,在应用程序的 Web.config 文件中放置控件时应使连接字符串的位置集中。这样做有两个好处:数据源控件可以从配置文件中引用连接字符串的名称,而不是包括连接字符串作为控件属性;由于连接字符串的管理集中进行,在连接字符串信息更改时无需重新访问各页,因此更易于管理站点。
在本主题中,您将了解如何使用 Visual Studio 和数据源控件在 Web.config 文件中放置连接字符串,以及如何使用命令行实用工具 Aspnet_regiis.exe 加密连接字符串以额外提供一层安全保护。
如何使用数据源控件向 Web.config 中添加连接字符串
-
在 Visual Studio 的“设计”视图中打开一个 .aspx 页。
-
从“工具箱”的“数据”文件夹中,将一个数据源控件(如 SqlDataSource 控件)拖动到设计图面上。
-
右击该控件,然后单击“显示智能标记”。
-
在智能标记面板中,单击“配置数据源”。
-
在“选择数据连接”面板中,单击“新建连接”。
-
从“选择数据源”对话框的列表中选择适当的数据源,然后单击“确定”。
-
在“添加连接”对话框中指示正确的服务器名、用户名和密码,然后单击“确定”。
此时,您将返回到“配置数据源”对话框,其中提供了连接详细信息的摘要。
-
单击“下一步”,然后单击“是”以在 Web.config 文件中保存连接字符串。
连接字符串即存储在 Web.config 文件中,现在可以为控件配置查询详细信息。
加密 Web.config 文件中存储的连接字符串信息
-
在 Windows 命令行,使用以下选项运行 ASP.NET IIS 注册工具 (Aspnet_regiis.exe):
-
-pe 选项,向其传递字符串
"connectionStrings"
以加密 connectionStrings 元素。 -
-app 选项,向其传递应用程序的名称。
Aspnet_regiis.exe 工具位于
%systemroot%/Microsoft.NET/Framework/
versionNumber 文件夹中。下面的代码示例演示如何为名为
SampleApplication
的应用程序加密 Web.config 文件的 connectionStrings 节。复制代码
aspnet_regiis -pe "connectionStrings" -app "/SampleApplication"
当该命令完成时,可以查看 Web.config 文件的内容。connectionStrings 配置节将包含加密信息而不是明文形式的连接字符串,如下面的代码示例中所示。
复制代码
<configuration> <connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider"> <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns="http://www.w3.org/2001/04/xmlenc#"> <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" /> <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#"> <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" /> <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> <KeyName>RSA Key </KeyName> </KeyInfo> <CipherData> <CipherValue>WcFEbDX8VyLfAsVK8g6hZVAG1674ZFc1kWH0BoazgOwdBfinhcAmQmnIn0oHtZ5tO2EXGl+dyh10giEmO9NemH4YZk+iMIln+ItcEay9CGWMXSen9UQLpcQHQqMJErZiPK4qPZaRWwqckLqriCl9X8x9OE7jKIsO2Ibapwj+1Jo= </CipherValue> </CipherData> </EncryptedKey> </KeyInfo> <CipherData> <CipherValue>OpWQgQbq2wBZEGYAeV8WF82yz6q5WNFIj3rcuQ8gT0MP97aO9SHIZWwNggSEi2Ywi4oMaHX9p0NaJXG76aoMR9L/WasAxEwzQz3fexFgFSrGPful/5txSPTAGcqUb1PEBVlB9CA71UXIGVCPTiwF7zYDu8sSHhWa0fNXqVHHdLQYy1DfhXS3cO61vW5e/KYmKOGA4mjqT0VZaXgb9tVeGBDhjPh5ZlrLMNfYSozeJ+m2Lsm7hnF6VvFm3fFMXa6+h0JTHeCXBdmzg/vQb0u3oejSGzB4ly+V9O0T4Yxkwn9KVDW58PHOeRT2//3iZfJfWV2NZ4e6vj4Byjf81o3JVNgRjmm9hr9blVbbT3Q8/j5zJ+TElCn6zPHvnuB70iG2KPJXqAj2GBzBk6cHq+WNebOQNWIb7dTPumuZK0yW1XDZ5gkfBuqgn8hmosTE7mCvieP9rgATf6qgLgdA6zYyVV6WDjo1qbCV807lczxa3bF5KzKaVUSq5FS1SpdZKAE6/kkr0Ps++CE= </CipherValue> </CipherData> </EncryptedData> </connectionStrings> </configuration>
保持命令提示打开,以用于后续步骤。
-
-
通过检索当前的 WindowsIdentity 名称来确定用户帐户或标识 ASP.NET 运行所用的帐户。
下面的代码示例演示一种确定 WindowsIdentity 名称的方式。
Visual Basic 复制代码
<%@ Page Language="VB" %> <% Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name) %>
C# 复制代码
<%@ Page Language="C#" %> <% Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name); %>
注意
默认情况下,在 Windows Server 2003 中,在 Web.config 文件中禁用 ASP.NET 应用程序的模拟时,应用程序运行所用的标识为 NETWORK SERVICE 帐户。在其他 Windows 版本中,ASP.NET 使用本地 ASPNET 帐户运行。
运行 ASP.NET 所用的用户帐户或标识必须对用于加密和解密 Web.config 文件各节的加密密钥具有读取权限。本过程假定您的网站使用 Machine.config 文件中的名为“RsaProtectedConfigurationProvider”的默认 RsaProtectedConfigurationProvider 进行了配置。默认 RsaProtectedConfigurationProvider 使用的 RSA 密钥容器名为“NetFrameworkConfigurationKey”。
-
在命令提示处,使用以下选项运行 Aspnet_regiis.exe 工具:
-
-pa 选项,向其传递默认 RsaProtectedConfigurationProvider 的 RSA 密钥容器的名称。
-
在前一步中确定的 ASP.Net 应用程序的标识。
下面的代码示例演示如何授予 NETWORK SERVICE 帐户对计算机级别的“NetFrameworkConfigurationKey”RSA 密钥容器的访问权限。
复制代码
aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT AUTHORITY/NETWORK SERVICE"
-
-
若要解密已加密的 Web.config 文件内容,请使用 -pd 选项运行 aspnet_regiis.exe 工具。语法与使用 -pe 选项加密 Web.config 文件的语法相同,区别在于无需指定受保护的配置提供程序。相应的提供程序在受保护节的 configProtectionProvider 属性中标识。
下面的代码示例演示如何解密 ASP.NET 应用程序
SampleApplication
的 connectionStrings 元素。复制代码
aspnet_regiis -pd "connectionStrings" -app "/SampleApplication"