Tuesday, November 28, 2006

确保使用数据源控件时连接字符串的安全


[from MSDN]





在处理数据源控件时,建议您将连接字符串集中存储在应用程序的 Web.config 文件中。这会使连接字符串可供一个 Web 应用程序中的所有 ASP.NET 页使用,从而简化了连接字符串的管理。另外一个优势是,当连接字符串信息发生更改时,无需修改许多页。最后,您可以使用受保护配置对 Web.config 文件的连接字符串节进行加密,从而提高存储在连接字符串中的敏感信息(如数据库名称、用户名、密码等)的安全性。


本主题描述如何将连接字符串存储在 Web.config 文件的connectionStrings配置节,以及如何使用命令行 .NET Framework 工具来加密连接字符串以实现额外的安全性。



将连接字符串存储在 Web.config 文件中





  1. 打开应用程序的 Web.config 文件。如果 Web.config 文件尚不存在,请创建一个名为 Web.config 的文本文件并添加以下内容:






    <?xml version="1.0"?>
    <configuration
    xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
    <appSettings/>
    <system.web>
    </system.web>
    </configuration>



  2. configuration 元素中,创建一个名为 connectionStrings 的新元素,如下面的示例所示:






    <?xml version="1.0"?>
    <configuration
    xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
    <connectionStrings> </connectionStrings>
    <appSettings/>
    <system.web>
    </system.web>
    </configuration>



  3. connectionStrings 元素中,针对将用在 Web 应用程序中的每个连接字符串创建一个 add 元素。将包括下表所示的属性。






















    属性说明



    • name





    此连接字符串配置对象的名称。此名称将由数据源控件和其他功能用来引用连接字符串信息。





    • connectionString





    数据源的连接字符串。





    • providerName





    要用于此连接的 NET Framework 数据提供程序的命名空间,如 System.Data.SqlClientSystem.Data.OleDbSystem.Data.Odbc




    一个完整的 connectionStrings 元素可能如下面的示例所示:






    <connectionStrings>
    <add
    name="NorthwindConnection"
    connectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;" />
    </connectionStrings>



  4. 保存并关闭 Web.config 文件。


    现在,可以通过引用为 name 属性指定的名称来引用数据源控件的连接字符串。




  5. 在数据源控件的 ConnectionString 属性中,使用连接字符串表达式语法引用 Web.config 文件中的连接信息。


    下面的示例演示 SqlDataSource 控件,该控件读取 Web.config 文件中的连接字符串:






    <asp:SqlDataSource ID="ProductsDataSource" Runat="server"
    SelectCommand="SELECT * from Products"
    ConnectionString="<%$ ConnectionStrings: NorthwindConnection %>"
    </asp:SqlDataSource>




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





  1. 在 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>

    使该命令提示符处于打开状态以供后面的步骤使用。




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


    下面的示例演示一种用来确定 WindowsIdentity 名称的方法:




    <%@ Page Language="C#" %>
    <%
    Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name);
    %>















  3. 注意

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




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




  4. 在命令提示符下,运行带有下列选项的 aspnet_regiis.exe 工具:




    • -pa 选项,向它传递默认 RsaProtectedConfigurationProvider 的 RSA 密钥容器的名称。




    • 在前面的步骤中确定的 ASP.Net 应用程序的标识。




    下面的示例演示如何授予 NETWORK SERVICE 帐户对计算机级的"NetFrameworkConfigurationKey"RSA 密钥容器的访问权限:




    aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT AUTHORITY\NETWORK SERVICE"


  5. 若要对加密的 Web.config 文件内容进行解密,请运行带有 -pd 选项的 aspnet_regiis.exe 工具。除了不指定受保护配置提供程序外,该语法与使用 -pe 选项加密 Web.config 文件内容的语法相同。相应的提供程序是在受保护节的 configProtectionProvider 属性中标识的。


    下面的示例演示如何对 ASP.NET 应用程序 SampleApplicationconnectionStrings 元素进行解密。






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







No comments: