如何:在使用数据源控件时保证连接字符串的安全

更新:2007 年 11 月

使用数据源控件时,在应用程序的 Web.config 文件中放置控件时应使连接字符串的位置集中。这样做有两个好处:数据源控件可以从配置文件中引用连接字符串的名称,而不是包括连接字符串作为控件属性;由于连接字符串的管理集中进行,在连接字符串信息更改时无需重新访问各页,因此更易于管理站点。

在本主题中,您将了解如何使用 Visual Studio 和数据源控件在 Web.config 文件中放置连接字符串,以及如何使用命令行实用工具 Aspnet_regiis.exe 加密连接字符串以额外提供一层安全保护。

如何使用数据源控件向 Web.config 中添加连接字符串

  1. 在 Visual Studio 的**“设计”**视图中打开一个 .aspx 页。

  2. 从**“工具箱”“数据”**文件夹中,将一个数据源控件(如 SqlDataSource 控件)拖动到设计图面上。

  3. 右击该控件,然后单击**“显示智能标记”**。

  4. 在智能标记面板中,单击**“配置数据源”**。

  5. 在**“选择数据连接”面板中,单击“新建连接”**。

  6. 从**“选择数据源”对话框的列表中选择适当的数据源,然后单击“确定”**。

  7. 在**“添加连接”对话框中指示正确的服务器名、用户名和密码,然后单击“确定”**。

    此时,您将返回到**“配置数据源”**对话框,其中提供了连接详细信息的摘要。

  8. 单击**“下一步”,然后单击“是”**以在 Web.config 文件中保存连接字符串。

    连接字符串即存储在 Web.config 文件中,现在可以为控件配置查询详细信息。

加密 Web.config 文件中存储的连接字符串信息

  1. 在 Windows 命令行,使用以下选项运行 ASP.NET IIS 注册工具 (Aspnet_regiis.exe):

    • -pe 选项,向其传递字符串 "connectionStrings" 以加密 connectionStrings 元素。

    • -app 选项,向其传递应用程序的名称。

    Aspnet_regiis.exe 工具位于 %systemroot%\Microsoft.NET\Framework\版本号 文件夹中。

    下面的代码示例演示如何为名为 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>
    

    保持命令提示打开,以用于后续步骤。

  2. 通过检索当前的 WindowsIdentity 名称来确定用户帐户或标识 ASP.NET 运行所用的帐户。

    下面的代码示例演示一种确定 WindowsIdentity 名称的方式。

    <%@ Page Language="VB" %>
    <%
    Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name)
    %>
    
    <%@ Page Language="C#" %>
    <%
    Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name);
    %>
    
    ms178372.alert_note(zh-cn,VS.90).gif说明:

    默认情况下,在 Windows Server 2003 中,在 Web.config 文件中禁用 ASP.NET 应用程序的模拟时,应用程序运行所用的标识为 NETWORK SERVICE 帐户。在其他 Windows 版本中,ASP.NET 使用本地 ASPNET 帐户运行。

    运行 ASP.NET 所用的用户帐户或标识必须对用于加密和解密 Web.config 文件各节的加密密钥具有读取权限。本过程假定您的网站使用 Machine.config 文件中的名为“RsaProtectedConfigurationProvider”的默认 RsaProtectedConfigurationProvider 进行了配置。默认 RsaProtectedConfigurationProvider 使用的 RSA 密钥容器名为“NetFrameworkConfigurationKey”。

  3. 在命令提示处,使用以下选项运行 Aspnet_regiis.exe 工具:

    下面的代码示例演示如何授予 NETWORK SERVICE 帐户对计算机级别的“NetFrameworkConfigurationKey”RSA 密钥容器的访问权限。

    aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT AUTHORITY\NETWORK SERVICE"
    
  4. 若要解密已加密的 Web.config 文件内容,请使用 -pd 选项运行 aspnet_regiis.exe 工具。语法与使用 -pe 选项加密 Web.config 文件的语法相同,区别在于无需指定受保护的配置提供程序。相应的提供程序在受保护节的 configProtectionProvider 属性中标识。

    下面的代码示例演示如何解密 ASP.NET 应用程序 SampleApplication 的 connectionStrings 元素。

    aspnet_regiis -pd "connectionStrings" -app "/SampleApplication"
    

请参见

其他资源

使用受保护的配置加密配置信息