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.Encrypt 或 FormsAuthentication.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.Encrypt 或 Decrypt 方法,则使用指定的 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] 下一页 [C语言系列]NET 中C#的switch语句的语法 [系统软件]托拽Explore中的文件到VB.net的窗口 [系统软件]Boost库在XP+Visual C++.net中的安装 [常用软件]新配色面板:Paint.Net3.0RC1官方下载 [常用软件]用内建的“Net Meeting”聊天 [VB.NET程序]Henry的VB.NET之旅(三)—共享成员 [VB.NET程序]Henry的VB.NET之旅(二)—构造与析构 [VB.NET程序]Henry的VB.NET之旅(一)—失踪的窗体 [VB.NET程序]在托盘上显示Balloon Tooltip(VB.NET) [VB.NET程序]Henry手记-VB.NET中动态加载Treeview节点(二)
|