asp.net 安全性
本章内容
本指南中论述的分布式 Web 应用程序开发的中心一环就是 ASP.NET。它提供了一组丰富的、易于使用的安全功能,来帮助创建安全的 Web 应用程序。ASP.NET 设计为与 Internet 信息服务 (IIS)、Windows 平台和 .NET Framework 的现有安全功能一起使用,同时兼具灵活性和可扩展性。这意味着您可以构建能够与您的应用程序紧密集成的自定义安全机制。
本章提供的指南和建议可以帮助您解决在构建安全的 ASP.NET Web 应用程序时遇到的身份验证、授权和安全通信问题。
注意:本章提供的很多指导和建议同样适用于 ASP.NET Web 服务和 ASP.NET 承载的 .NET Remoting 对象(将分别在第 10 章和第 11 章中详细讨论)的开发。
返回页首
目标
本章的目标是:
? 保护您的 ASP.NET 应用程序。
? 保护由 ASP.NET 应用程序保存的机密和状态信息。
? 理解 ASP.NET 应用程序的安全体系结构,并了解如何协同使用 IIS、Windows、.NET Framework 和 ASP.NET 的安全功能以确保分布式 Web 应用程序的安全。
? 选择适用于您的应用程序的身份验证和授权策略。
? 理解 ASP.NET 进程标识和模拟在您的应用程序访问下游资源(例如文件和数据库)时起到的作用。
? 结合使用产品配置工具和编程技术,实现 ASP.NET web 应用程序的安全设计。
返回页首
适用范围
本章适用于以下产品和技术:
? Windows XP 或 Windows 2000 Server (service pack 3) 和更高版本的操作系统
? Microsoft Internet 信息服务 5.0 和更高版本
? Microsoft Active Directory
? .NET Framework 版本 1.0 (Service Pack 2)
? Visual Studio 1.0 .NET 和更高版本
? Visual C# .NET
? SQL Server 2000 (service pack 2) 和更高版本
返回页首
如何使用本章内容
若要学好本章内容:
? 您必须具有使用 Visual C# .NET 和 Visual Studio .NET 编程的经验。
? 您必须具有开发和配置 ASP.NET Web 应用程序的经验。
? 您必须具有配置 IIS 安全性的经验。
? 您必须具有使用 Windows 管理工具配置 Windows 安全性和创建用户帐户的经验。
? 您必须具有配置 Active Directory 的经验。
? 您必须具有开发和配置企业服务 (COM+) 应用程序的经验。
? 阅读第 1 章简介。这一章说明了身份验证、授权和安全通信对于分布式 Web 应用程序的重要性。
? 阅读第 2 章 ASP.NET 应用程序的安全模型。这一章概述了创建分布式 ASP.NET Web 应用程序所采用的体系结构和技术,并重点说明了身份验证、授权和安全通信在该体系结构中适用的位置。
? 阅读第 3 章身份验证和授权。这一章介绍了使用 ASP.NET 时可用的身份验证和授权机制。
? 阅读第 4 章安全通信。这一章介绍了在 ASP.NET 和分布式 Web 应用程序的其他元素之间可用于实现安全通信的各种技术。
? 请阅读以下章节,其中逐步介绍了如何实现本章中所述的许多技术:
? 如何创建自定义帐户来运行 ASP.NET
? 如何在 Web 服务器上设置 SSL
? 如何使用 SSL 来确保与 SQL Server 2000 安全通信
? 如何使用 IPSec 在两个服务器之间进行安全通信
? 如何实现 IPrincipal
? 如何将窗体身份验证用于 SQL Server 2000
? 如何将窗体身份验证用于 Active Directory
? 如何利用窗体身份验证创建 GenericPrincipal 对象
? 如何为 Windows 2000 实现 Kerberos 委派
返回页首
ASP.NET 安全体系结构
ASP.NET 与 IIS、.NET Framework 和操作系统所提供的基础安全服务配合使用,共同提供一系列身份验证和授权机制。图 8.1 中总结了这些情况。
图 8.1
ASP.NET 安全服务
图 8.1 阐释了 IIS 和 ASP.NET 所提供的身份验证和授权机制。当客户端发出 Web 请求时,就会发生下面一系列身份验证和授权事件:
1.
接收来自网络的 HTTP(S) Web 请求。可以使用 SSL 确保服务器标识(使用服务器证书)和客户端标识(可选)的安全。
注意:SSL 还提供了一个安全通道,以便保护在客户端和服务器之间传送的机密数据。
2.
IIS 使用基本、摘要、集成(NTLM 或 Kerberos)或证书身份验证对调用方进行身份验证。如果站点的所有或部分内容不需要经过身份验证即可访问,则可以将 IIS 配置为使用匿名身份验证。IIS 为每个已进行身份验证的用户创建一个 Windows 访问令牌。如果选择匿名身份验证,则 IIS 为匿名 Internet 用户帐户(默认情况下为 IUSR_MACHINE)创建访问令牌。
3.
IIS 授予调用方访问所请求资源的权限。使用附加到所请求资源的 ACL 定义的 NTFS 权限授权访问。IIS 也可以配置为只接受来自特定 IP 地址的客户端计算机的请求。
4.
IIS 将已进行身份验证的调用方的 Windows 访问令牌传递到 ASP.NET(如果使用的是匿名身份验证,则它可能是匿名 Internet 用户的访问令牌)。
5.
ASP.NET 对调用方进行身份验证。
如果将 ASP.NET 配置为使用 Windows 身份验证,则此时不会发生任何其他的身份验证。ASP.NET 将接受它从 IIS 收到的任何令牌。
如果将 ASP.NET 配置为使用窗体身份验证,将根据数据存储(通常为 Microsoft? SQL Server? 数据库或 Active Directory? 目录服务)对调用方提供的凭据进行身份验证(使用 HTML 窗体)。如果将 ASP.NET 配置为使用 Passport 身份验证,则将用户重定向到 Passport 站点,然后 Passport 身份验证服务对用户进行身份验证。
6.
ASP.NET 授权访问所请求的资源或操作。
UrlAuthorizationModule(系统提供的 HTTP 模块)使用在 Web.config 中配置的授权规则(具体来说就是 <authorization> 元素),确保调用方可以访问所请求的文件或文件夹。
在 Windows 身份验证中,FileAuthorizationModule(另一个 HTTP 模块)检查调用方是否具有访问所请求资源的必要权限。将调用方的访问令牌与保护资源的 ACL 进行比较。
也可以使用 .NET 角色(以声明方式或编程方式)确保给调用方授予访问所请求资源或执行所请求操作的权限。
7.
应用程序中的代码使用特定标识来访问本地和/或远程资源。默认情况下,ASP.NET 不执行模拟,因此,配置的 ASP.NET 进程帐户提供标识。也可以选择原调用方的标识(如果启用了模拟)或已配置的服务标识。
网关守卫
ASP.NET Web 应用程序中的授权点或网关守卫是由 IIS 和 ASP.NET 提供的:
IIS
如果禁用了匿名身份验证,则 IIS 只允许来自特定用户的请求,即它可以在其自己的域或受信任域中验证这些用户的身份。
对于静态文件类型(例如 .jpg、.gif 和 .htm 文件,即没有映射到 ISAPI 扩展的文件),IIS 使用与所请求文件关联的 NTFS 权限执行访问控制。
ASP.NET
ASP.NET 网关守卫包括 UrlAuthorizationModule、FileAuthorizationModule 以及主体权限要求和角色检查。
UrlAuthorizationModule
可以配置应用程序 Web.config 文件中的 <authorization> 元素,控制哪些用户和用户组应有权访问应用程序。授权是以存储在 HttpContext.User 中的 IPrincipal 对象为基础的。
FileAuthorizationModule
对于由 IIS 映射到 ASP.NET ISAPI 扩展 (Aspnet_isapi.dll) 的文件类型,使用已进行身份验证的用户的 Windows 访问令牌(可能为 IUSR_MACHINE),根据附加到所请求的 ASP.NET 文件中的 ACL 自动执行访问检查。
注意:模拟并非进行文件授权所必需的。
FileAuthorizationModule 类仅对所请求的文件执行访问检查,而不对所请求页面中的代码访问的文件执行访问检查,但 IIS 对这些文件执行访问检查。
例如,如果您请求 Default.aspx 并且它包含一个嵌入的用户控件 (Usercontrol.ascx),该控件又包含一个图像标记(指向 Image.gif),则 FileAuthorizationModule 对 Default.aspx 和 Usercontrol.ascx 执行访问检查,因为 IIS 将这些文件类型映射到 ASP.NET ISAPI 扩展。
FileAuthorizationModule 不对 Image.gif 执行检查,因为它是由 IIS 内部处理的静态文件。但是,由于 IIS 对静态文件执行访问检查,因此,仍须使用进行相应配置的 ACL 给已进行身份验证的用户授予读取该文件的权限。
图 8.2 中显示了此方案。
系统管理员注意事项:需要给已进行身份验证的用户授予读取此方案中涉及的所有文件的 NTFS 权限。唯一可变化的方面是使用哪个网关守卫来执行访问控制。ASP.NET 进程帐户只需要对 ASP.NET 注册文件类型的读访问权限。
图 8.2
IIS 和 ASP.NET 网关守卫一起使用
在此方案中,您可以在文件入口处禁止访问。如果您配置了附加到 Default.aspx 的 ACL 并且拒绝访问某个特定的用户,则 Default.aspx 中的代码无法将用户控件或任何嵌入图像发送到客户端。如果该用户直接请求图像,则 IIS 亲自执行访问检查。
主体权限要求和明确的角色检查
除了可以用 IIS 和 ASP.NET 配置的网关守卫外,还可以将主体权限要求(以声明方式或编程方式)用作附加的细分访问控制机制。通过使用主体权限检查(由 PrincipalPermissionAttribute 类执行),您可以根据各个用户的标识和组成员身份(由附加到当前线程的 IPrincipal 对象定义)控制对类、方法或个别代码块的访问。
注意:用于请求角色成员身份的主体权限要求与调用 IPrincipal.IsInRole 来测试角色成员身份不同;如果调用方不是指定角色的成员,则前者产生异常,而后者仅返回一个布尔值以确认角色成员身份。
在 Windows 身份验证中,ASP.NET 自动将一个代表已进行身份验证的用户的 WindowsPrincipal 对象附加到当前的 Web 请求(使用 HttpContext.User)。窗体身份验证和 Passport 身份验证创建具有相应标识但没有角色的 GenericPrincipal 对象,并将它附加到 HttpContext.User。
更多信息
? 有关配置安全性的详细信息,请参见本章后面的配置安全性。
? 有关编程安全性(和 IPrincipal 对象)的详细信息,请参见本章后面的编程安全性。
返回
评论0