打印本文 打印本文 关闭窗口 关闭窗口
ASP.NET 安全性
作者:武汉SEO闵涛  文章来源:敏韬网  点击数8964  更新时间:2009/4/23 10:44:53  文章录入:mintao  责任编辑:mintao
rkTimeout="10" sqlConnectionString="data source=127.0.0.1;user id=sa;password=" cookieless="false" timeout="20"/>

默认情况下, SQL 脚本 InstallSqlState.sql (用于生成 SQL 会话状态使用的数据库)安装在以下位置:

C:\WINNT\Microsoft.NET\Framework\v1.0.3705

在使用 SQL 会话状态时,需要考虑以下两个问题。

必须保护数据库连接字符串的安全。

在网络上传递时,必须保护会话状态的安全。

保护数据库连接字符串

如果使用 SQL 身份验证连接到服务器,则连接字符串在包含用户名和密码的 sqlConnectionString 属性中指定。使用 aspnet_setreg.exe 实用工具在注册表中存储加密的连接字符串。以下示例显示了使用 aspnet_setreg.exe 前后的 <sessionState> 元素。

<!-- Before -->
<sessionState 
    mode="SQLServer", 
    sqlConnectionString="data source=Server;user id=userID;password=pwd" . . . />
<!-- After -->
<sessionState mode="SQLServer"
              sqlConnectionString="registry:HKLM\SOFTWARE\YourSecureApp\
              sessionState\ASPNET_SETREG,sqlConnectionString" />

如果您使用 ASP.NET 状态服务,也可以使用 aspnet_setreg.exe 来加密 stateConnectionString 属性。

如果可能,应该对 SQL Server 状态数据库使用 Windows 身份验证。这将带来其他一些优点:连接字符串不包含凭证,凭证不通常网络传递到数据库服务器。

要使用 Windows 身份验证,可以使用 ASP.NET 进程标识(通常是 ASPNET)

1.

在数据库服务器上创建一个重复的帐户(使用相同的名称和密码)。

2.

为该帐户创建 SQL 登录。

3.

ASPState 数据库中创建一个数据库用户,并将 SQL 登录映射到该新用户。

ASPState 数据库是由 InstallSQLState.sql 脚本创建的。

4.

创建一个用户定义的数据库角色,并将数据库用户添加到该角色。

5.

在数据库中为该数据库角色配置权限。

然后,可以更改连接字符串以使用受信任的连接(如下所示):

sqlConnectionString="server=127.0.0.1;
                     database=StateDatabase;
                     Integrated Security=SSPI;"

在网络上保护会话状态

在通过网络将会话状态传递到 SQL Server 数据库时,可能需要对会话状态进行保护。这取决于承载 Web 服务器和数据服务器的网络的安全性。如果已在受信任环境中对数据库进行物理保护,则可能不必采取这一额外的安全措施。

可以使用 IPSec 保护 Web 服务器和 SQL Server 之间的所有 IP 通信,或者使用 SSL 保护到 SQL Server 的链路。通过使用此方法,您可以选择只加密用于会话状态的连接,而不是在计算机之间进行的所有通信。

更多信息

有关如何设置 SQL 会话状态的详细信息,请参见 Microsoft 知识库文章 Q317604“HOW TO:Configure SQL Server to Store ASP.NET Session State”。

有关对 SQL Server 使用 SSL 的详细信息,请参见“How To Use SSL to Secure Communication with SQL Server 2000”。

有关使用 IPSec 的详细信息,请参见“How To Use IPSec to Provide Secure Communication Between Two Servers”。

返回页首返回页首

网络场注意事项

在网络场方案中,不能保证来自同一个客户端的后续请求由同一个 Web 服务器提供服务。对于状态管理和任何取决于 Machine.config 中 <machineKey> 元素所保存的属性的加密而言,这会产生不利影响。

会话状态

默认 ASP.NET 进程内会话状态处理(它镜像以前的 ASP 功能)产生服务器关系,并且不能在网络场方案中使用。对于网络场部署,必须在进程外将会话状态存储到 ASP.NET 状态服务或 SQL Server 数据库中(如前所述)。

不能依赖应用程序状态来保存网络场(将 Web 应用程序配置为在多台服务器上运行)或网络园(将 Web 应用程序配置为在多个处理器上运行)方案中的全局计数器或惟一值,因为在进程或计算机之间不能共享应用程序状态。

DPAPI

DPAPI 能够与机器存储或用户存储(需要一个已加载的用户配置文件)配合使用。如果您将 DPAPI 和机器存储一起使用,那么加密字符串是给定计算机所特有的,因此您必须在每台计算机上生成加密数据。不要在网络场或群集中的计算机之间复制加密数据。

如果将 DPAPI 和用户存储一起使用,则可以用一个漫游的用户配置文件在任何一台计算机上解密数据。

更多信息

有关 DPAPI 的详细信息,请参见“数据访问安全性”一章。

在网络场中使用窗体身份验证

如果使用窗体身份验证,则网络场中的所有服务器必须共享一个通用机密密钥,此密钥用于身份验证票证的加密、解密和验证。

机密密钥保存位于 Machine.config 的 <machineKey> 元素中。默认设置如下所示。

<machineKey validationKey="AutoGenerate" 
            decryptionKey="AutoGenerate" 
            validation="SHA1"/> 

此设置导致每台机器生成一个不同的检验和解密密钥。必须更改 <machineKey> 元素,并将通用密钥值放在网络场中的所有服务器上。

元素

可以使用 Machine.config 中的 <machineKey> 元素,配置用于加密和解密窗体身份验证 Cookie 数据和视图状态的密钥。

在调用 FormsAuthentication.EncryptFormsAuthentication.Decrypt 方法以及创建或检索视图状态时,将参考 <machineKey> 元素中的值。

<machineKey validationKey="autogenerate|value"
            decryptionKey="autogenerate|value"
            validation="SHA1|MD5|3DES" />

validationKey 属性

validationKey 属性值用于创建和检验视图状态和窗体身份验证票证的 MAC 代码。此检验属性表明在执行 MAC 生成时使用哪种算法。请注意以下方面:

在使用窗体身份验证时,此密钥与 <forms> protection 属性配合使用。如果将保护属性设置为 Validation,然后调用 FormsAuthentication.Encrypt 方法,则使用票证值和 validationKey 来计算附加到 Cookie 中的 MAC。在调用 FormsAuthentication.Decrypt 方法时,就会计算 MAC 并将它与附加到票证上的 MAC 进行比较。

在使用视图状态时,可以使用控件的视图状态和 validationKey 来计算附加到视图状态上的 MAC。在将视图状态从客户端发回时,应重新计算 MAC 并将它与附加到视图状态上的 MAC 进行比较。

decryptionKey 属性

decryptionKey 属性值用于加密和解密窗体身份验证票证和视图状态。可以使用 DES 或 Triple DES (3DES) 算法。具体的算法取决于服务器上是否安装了 Windows 2000 高度加密包。如果安装了该程序包,则使用 3DES,否则使用 DES。请注意以下方面:

在使用窗体身份验证时,密钥与 <forms> protection 属性配合使用。如果将 protection 属性设置为 Encryption,并且调用了 FormsAuthentication.EncryptDecrypt 方法,则使用指定的 decryptionKey 值加密或解密票证值。

通过使用视图状态,在将控件的视图状态值发送到客户端时,使用 decryptionKey 值对它进行加密;并在客户端将数据发回服务器时对它进行解密。

Validation 属性

此属性规定检验、加密和解密时使用哪种算法。它可以采用 SHA1、MD5 或 3DES 值。以下是这些值的描述:

SHA1。如果设置为 SHA1,则实际使用 HMACSHA1 算法。它生成 160 位(20 个字节)的输入哈希值或摘要。HMACSHA1 是一种加密哈希算法。此算法的输入密钥是由 validationKey 属性指定的。

SHA1 由于比其他算法具有更大的摘要,因此成为常用的算法。

MD5。它使用 MD5 算法生成 20 个字节的哈希值。

3DES。它使用 Triple DES (3DES) 算法加密数据。

在将验证属性设置为 3DES 时,窗体身份验证实际上并不使用它,而是使用 SHA1。

更多信息

有关如何创建适于放在 Machine.config 中的密钥的信息,请参见 Microsoft 知识库文章 Q312906“HOW TO:Create Keys by using Visual C# .NET for Use in Forms Authentication”。

有关 Windows 2000 高度加密包的详细信息,请参见 http://www.microsoft.com/windows2000/downloads/recommended/encryption/

返回页首返回页首

小结

本章介绍了各种保护 ASP.NET Web 应用程序的技术和方法。本章提供的大多数指南和建议同样适用于开发 ASP.NET Web 服务和由 ASP.NET 驻留的 .NET Remoting 对象。概括如下:

如果应用程序使用窗体身份验证,而且在用户身份验证中需要考虑性能问题,则检索角色列表并将其存储在身份验证票证中。

如果使用窗体身份验证,则始终给每个请求创建一个主体并将其存储在上下文中。

如果角色太多而无法存储在身份验证 Cookie 中,则使用全局应用程序缓存来存储角色。

不要创建权限最少的自定义帐户来运行 ASP.NET。而是应该更改 ASPNET 帐户密码,并在应用程序需要访问的任何远程 Windows 服务上创建重复帐户。

如果必须创建自定义帐户以运行 ASP.NET,请使用权限最少的用户。例如:

如果主要考虑管理问题,请使用权限最少的域帐户。

如果使用本地帐户,则必须在 Web 应用程序需要访问的任何远程计算机上创建重复帐户;如果应用程序需要访问非信任域中的资源或者防火墙禁止 Windows 身份验证,则必须使用本地帐户。

不要使用本地 SYSTEM 帐户来运行 ASP.NET。

不要授予 ASPNET 帐户“充当操作系统的一部分”权限。

在以下情况中使用 SSL:

在浏览器和 Web 服务器之间传送安全敏感信息时。

 << 上一页  [11] [12]  下一页

打印本文 打印本文 关闭窗口 关闭窗口