保证成员资格的安全

更新:2007 年 11 月

ASP.NET 成员资格提供了用于管理和验证用户的功能,最常用于 Forms 身份验证和身份验证控件,如 LoginLoginViewLoginStatusLoginNamePasswordRecoveryCreateUserWizard 控件。 本主题描述如何通过在配置网站和使用成员资格类编写代码方面的最佳做法,优化成员资格功能的安全性。

虽然这些最佳做法可以提高应用程序的安全,但您还需要不断地更新应用程序服务器,安装最新的 Microsoft Windows 和 Internet 信息服务 (IIS) 的安全修补程序以及 Microsoft SQL Server 或其他成员资格数据源的任何修补程序,这一点也很重要。

有关编写安全代码及保证应用程序安全的最佳做法的更多详细信息,请参见由 Michael Howard 和 David LeBlanc 编写的著作 Writing Secure Code(《编写安全代码》)以及 Microsoft Patterns and Practices(Microsoft 模式和实践)中提供的指导 (https://www.microsoft.com/resources/practices/default.mspx)。

保证成员资格配置的安全

默认情况下,将为 ASP.NET 应用程序启用成员资格功能,且不能禁用。 默认的配置设置将设为最安全的值。 有关成员资格配置设置及其默认值的信息,请参见 membership 元素(ASP.NET 设置架构)。 您应将 requiresQuestionAndAnswer 属性设置为 true,特别是 enablePasswordReset 或 enablePasswordRetrieval 也为 true 的情况。

保证配置值的安全

当在应用程序的配置文件中存储敏感信息时,应使用受保护配置对敏感值进行加密。 特别敏感的信息包括存储在 machineKey 配置元素中的加密密钥,以及存储在 connectionStrings 配置元素中的用来连接数据源的连接字符串。 有关更多信息,请参见使用受保护的配置加密配置信息

保证加密密钥和哈希算法的安全

强烈建议您对成员资格数据源中的用户密码进行加密,使用 passwordFormat 属性并将其设置为 Hashed 或 Encrypted,其中 Hashed 是最安全的格式。 指定加密算法的加密密钥值存储在 machineKey 配置元素中。 对于强加密,应为选定的加密算法指定一个加密密钥,该密钥是一个随机生成的、具有适当长度的值。

在承载多个应用程序的服务器上,建议您为每个应用程序定义唯一的加密密钥。 还有一种较不安全的做法,就是先定义一个加密密钥,然后用该密钥指定 IsolateApps 选项。

您可以在主服务器上设置计算机配置,不让应用程序重写配置设置。 这包括不让在应用程序的 Web.config 文件中重新定义加密密钥。

保证与成员资格数据源的连接的安全

连接字符串

若要保证与数据库服务器的连接的安全,应使用受保护配置对配置中的连接字符串信息进行加密。 有关更多信息,请参见使用受保护的配置加密配置信息

使用集成安全性连接到 SQL Server

您应使用集成安全性连接到运行 SQL Server 的计算机,以避免泄露连接字符串以及暴露用户 ID 和密码的可能性。 在指定使用集成安全性的连接以连接到运行 SQL Server 的计算机时,成员资格功能将恢复为进程标识。 应确保运行 ASP.NET 的进程(例如应用程序池)的标识是默认的进程帐户或受限制的用户帐户。 有关更多信息,请参见 ASP.NET 模拟

SQL Server 数据库权限

用于存储成员资格用户信息的 SQL Server 数据库包括一些数据库角色和视图,可让您限制用户仅可访问必需的功能和可见范围。 应将必需的最小特权分配给连接到 SQL Server 成员资格数据库的用户 ID。 有关更多信息,请参见 SQL Server 应用程序服务数据库中的角色和视图

SQL Server Express 辅助进程标识

SQL Server Express 2005 包括一种新的操作模式,可以启动作为连接用户的标识运行的辅助进程。 此功能称为“作为用户运行”模式。 虽然在使用 IIS 时此操作模式适用于桌面开发,但在承载有多个不受信任的客户基本代码的 Web 服务器上,启动辅助进程并不适用。 包含互不信任的应用程序的共享主服务器应显式禁用“作为用户运行”功能。 通过连接到 SQL Express 实例(例如,osql –E –S .\sqlexpress)并发出以下 Transact-SQL 命令,可关闭此功能。

EXEC sp_configure 'show advanced option', '1'

GO

RECONFIGURE WITH OVERRIDE

GO

EXEC sp_configure 'user instances enabled', 0

GO

RECONFIGURE WITH OVERRIDE

GO

保证使用成员资格的网页的安全

用于敏感数据的应用程序页(如登录页)应使用标准 Web 安全机制来保证安全。 这些机制包括各种措施,如使用安全套接字层 (SSL) 以及要求用户应先登录才能执行敏感操作,如更新用户信息或删除用户。

此外,网页上不应以明文形式公开敏感数据,如密码(有时候还包括用户名)。 请确保显示这种信息的页面使用了 SSL,并且仅可供已经过身份验证的用户使用。 此外,请避免在 Cookie 中存储敏感数据或通过不安全的连接发送敏感数据。

防范拒绝服务攻击

如果大量客户端同时调用需执行更新或大型搜索操作的方法,则可能会降低成员资格数据源的响应速度。 若要减少遭受拒绝服务攻击的机会,请将使用了需执行数据库更新或搜索的方法的 ASP.NET 页限制为只允许管理用户访问,而只公开用作一般用途的、用于验证和密码管理的 ASP.NET 页。

错误消息和事件

异常

若要防止向不必要的源公开敏感信息,可对应用程序进行配置,从而做到不显示详细的错误消息,或者仅当客户端是 Web 服务器本身时才显示详细错误消息。 有关更多信息,请参见 customErrors 元素(ASP.NET 设置架构)

事件日志

如果服务器运行的是 Windows Server 2003,则可通过保证事件日志的安全,以及设置有关事件日志的大小、保留时间等参数,从而防止间接拒绝服务攻击,提高应用程序的安全性。

运行状况监视

使用 ASP.NET 运行状况监视功能可记录成功和失败的登录尝试。 在默认配置中,这意味着失败的登录尝试在**“应用程序”**事件日志中记录用户名和其他诊断信息。 请确保限制对此事件日志的访问以将这些信息保密。

自定义成员资格提供程序

创建自定义成员资格提供程序时,请确保遵循安全最佳做法,以避免在使用数据库时受到攻击,如 SQL 注入式攻击。 使用自定义成员资格提供程序时,请确保已对照安全最佳做法对提供程序进行了检查。

使用区域敏感字符

当使用 SQL Server 成员资格提供程序或自定义成员资格提供程序时,可以对数据源进行配置以将成员资格数据存储为区域敏感格式。 但是,ASP.NET 会将 authorization 配置元素中的用户名以及成员资格数据中的用户名计算为区域性固定的。 因此,未授权的用户可能被授予权限,这是因为,如果将未授权用户的名称视为区域性固定的,它将与授权用户的名称相同。

若要避免用户获得未授权的访问权限,请确保用户名在被计算为区域性固定时是唯一的。 或者,您也可以仅指定角色名称以便使用 authorization 配置元素进行授权,然后确保角色名称在被计算为区域性固定时是唯一的。 由于可将创建和管理角色限制为一项管理功能,因此使用角色名称指定授权通常是首选方法。

请参见

其他资源

使用成员资格管理用户