ASP.NET安全性如何?
浏览全部的安全性指导主题
Microsoft Corporation
本章内容
ASP.NET 是开发本指南所讨论的分布式 Web 应用程序的重心。它提供丰富而且容易访问的安全能力级,从而方便了安全的 Web 应用程序的创建。ASP.NET 被设计成与 Internet Information Services (IIS) 的现有安全能力相兼容,但同时它也非常灵活,而且可以扩展。这意味着您可以构建与自己的应用程序紧密集成的自定义安全机制。
本章提供指南和建议来帮助您解决在构建安全的 ASP.NET Web 应用程序时碰到的身份验证、授权和安全通信等问题。
注 本章所提供的大多数指南和建议同样适用于开发 ASP.NET Web 服务和由 ASP.NET 托管的 .NET Remoting 对象。
目标
利用本章来:
• |
保护您的 ASP.NET 应用程序。 |
• |
保护由 ASP.NET 应用程序维护的机密和状态信息。 |
• |
理解 ASP.NET 应用程序的安全体系结构,并了解 IIS、Windows、.NET Framework 和ASP.NET 的安全能力如何协调工作,从而为您的分布式 Web 应用程序提供安全性。 |
• |
选择一种适合于您的应用程序的身份验证和授权策略。 |
• |
理解 ASP.NET 进程标识和模拟对您的应用程序访问下游资源(如文件和数据库)的能力的影响。 |
• |
结合使用产品配置工具和编程技术来为您的 ASP.NET Web 应用程序实现安全设计。 |
适用于
本章适用于以下产品和技术:
• |
Microsoft® Windows® Server 2000 和 ™ 2003 操作系统 |
• |
Microsoft Internet Information Services 5.0 和更高版本 |
• |
Microsoft Active Directory® 目录服务 |
• |
Microsoft .NET Framework 1.0 版(带 service pack 2) |
• |
Microsoft Visual Studio® 1.0 .NET 开发系统和更高版本 |
• |
Microsoft Visual C#® .NET 开发工具 |
• |
Microsoft SQL Server™ 2000 (带 service pack 2)和更高版本 |
如何使用本章
要想从本单元获得最大价值,您必须:
• |
具有使用Visual C# .NET 和 Visual Studio .NET 进行编程的经验。 |
||||||||||||||||||
• |
具有开发和配置 ASP.NET Web 应用程序的经验。 |
||||||||||||||||||
• |
具有配置 IIS 安全性的经验。 |
||||||||||||||||||
• |
具有使用 Windows 管理工具配置 Windows 安全性和创建用户帐号的经验。 |
||||||||||||||||||
• |
具有配置 Active Directory 的经验。 |
||||||||||||||||||
• |
具有开发和配置 Enterprise Services (COM+) 应用程序的经验。 |
||||||||||||||||||
• |
阅读“Introduction”一章。它定义了身份验证、授权和安全通信对分布式 Web 应用程序的重要性。 |
||||||||||||||||||
• |
阅读“Security Model for ASP.NET Applications”一章。它概述了创建分布式 ASP.NET Web 应用程序所使用的体系结构和技术,并着重指出该体系结构的什么位置适用身份验证、授权和安全通信。 |
||||||||||||||||||
• |
阅读“身份验证和授权”一章。它介绍您在使用 ASP.NET 时可用的身份验证和授权机制。 |
||||||||||||||||||
• |
阅读“Secure Communication”一章。它介绍可用于保护 ASP.NET 与分布式 Web 应用程序之间的通信的各种技术。 |
||||||||||||||||||
• |
阅读以下各章,它们提供循序渐进的过程,为您显示如何实现本章所讨论的许多技术:
|
本页内容
ASP.NET 安全体系结构 | |
身份验证和授权策略 | |
配置安全性 | |
编程安全性 | |
Windows 身份验证 | |
窗体身份验证 | |
无 Cookie 窗体身份验证 | |
更多信息 | |
Passport 身份验证 | |
自定义身份验证 | |
ASP.NET 的进程标识 | |
模拟 | |
访问系统资源 | |
访问 COM 对象 | |
访问网络资源 | |
安全通信 | |
存储机密 | |
保护会话和视图状态 | |
网络场注意事项 | |
小结 |
ASP.NET 安全体系结构
ASP.NET 与 IIS、.NET Framework 和操作系统所提供的基础安全服务配合使用,共同提供一系列身份验证和授权机制。图 1 总结了这些机制。
图 1. ASP.NET 安全服务
图 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 配置为使用窗体身份验证,则将根据数据存储(通常为 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 对已验证用户授予读取该文件的权限。
图 2 显示了此方案。
注 对于系统管理员:需要给已通过身份验证的用户授予读取此方案中涉及的所有文件的 NTFS 权限。惟一的变化是使用哪个网关守卫来执行访问控制。ASP.NET 进程帐号只需要读取 ASP.NET 注册文件类型的访问权限。
图 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 对象)的详细信息,请参见本章后面的“编程安全性”。 |
身份验证和授权策略
ASP.NET 提供了若干以声明方式和编程方式进行授权的机制,这些机制可与各种身份验证方案配合使用。这样,您就可以开发深入的授权策略以及可以配置为提供各种粒度级别(例如,基于角色的每用户或每用户组)的授权策略。
本节说明一组常用身份验证选项的可用授权选项(可进行配置和编程)。
下面概述了身份验证选项:
• |
带模拟的 Windows 身份验证 |
• |
不带模拟的 Windows 身份验证 |
• |
使用固定身份的 Windows 身份验证 |
• |
窗体身份验证 |
• |
Passport 身份验证 |
可用的授权选项
下表列出了一组可用的授权选项。对于每个选项,该表都指出是否需要 Windows 身份验证和/或模拟。如果特定授权选项不需要 Windows 身份验证,则该选项适用于所有其他的身份验证类型。可以使用该表优化身份验证/授权策略。
表 1:Windows 身份验证和模拟要求 | ||
授权选项 | 需要 Windows 身份验证 | 需要模拟 |
FileAuthorizationModule |
是 |
否 |
UrlAuthorizationModule |
否 |
否 |
Principal Permission Demands |
否 |
否 |
.NET Roles |
否 |
否 |
Enterprise Services Roles |
是 |
是(在 ASP.NET Web 应用程序中) |
NTFS 权限(用于直接请求的静态文件类型;没有映射到 ISAPI 扩展的文件类型) |
不适用— ASP.NET 不处理这些文件。 |
否(IIS 执行访问检查。) |
NTFS 权限(用于 Web 应用程序代码访问的文件) |
否 |
否 |
带模拟的 Windows 身份验证
以下配置元素显示了如何明确启用 Web.config 或 Machine.config中的 Windows (IIS) 身份验证和模拟。
注 应根据每个应用程序的具体情况,在应用程序的 Web.config 文件中配置身份验证。
<authentication mode="Windows" /> <identity impersonate="true" />
在此配置中,ASP.NET 应用程序代码模拟已由 IIS 验证身份的调用者。
可配置的安全性
当您将 Windows 身份验证和模拟功能一起使用时,就可以使用下列授权选项:
• |
WindowsACLs
|
||||
• |
URL 授权。在 Web.config 中配置 URL 授权。在 Windows 身份验证中,用户名采用 DomainName/UserName 的格式,并且角色与 Windows 组 一 对应。 <authorization> <deny user="DomainName/UserName" /> <allow roles="DomainName/WindowsGroup" /> </authorization> |
||||
• |
Enterprise Services (COM+) 角色。角色保存在 COM+ 目录中。可以使用“组件服务”管理工具或脚本配置角色。 |
编程安全性
编程安全性是指 Web 应用程序代码中的安全检查。在您使用 Windows 身份验证和模拟功能时,可以使用下列程序安全设置选项:
• |
PrincipalPermission 请求
|
||||
• |
明确的角色检查。您可以使用 IPrincipal 接口执行角色检查。 IPrincipal.IsInRole(@"DomainName/WindowsGroup"); |
||||
• |
Enterprise Services (COM+) 角色。可以使用 ContextUtil 类以编程方式执行角色检查。 ContextUtil.IsCallerInRole("Manager") |
何时使用
使用 Windows 身份验证和模拟的情况:
• |
应用程序的用户已经有了可以由服务器验证的 Windows 帐号。 |
• |
您需要将原调用者的安全性上下文传递到 Web 应用程序的中间层和/或数据层以支持细分(每用户)授权。 |
• |
您需要将原调用者的安全性上下文传递到下游各层以支持操作系统级审核。 |
在应用程序中使用模拟之前,确保将此方法与使用受信任的子系统模型进行比较,了解此方法的优缺点。“身份验证和授权”一章中的“授权方式”章节中的“选择资源访问模式”详细阐述了这些内容。
模拟的缺点包括:
• |
由于无法对数据库连接进行池处理,因而降低了应用程序的可扩展性。 |
• |
由于需要给各个用户配置后端资源的 ACL,因而增加了管理工作。 |
• |
委派需要 Kerberos 身份验证和进行适当配置的环境。 |
更多信息
• |
有关 Windows 身份验证的详细信息,请参见本章后面的“Windows 身份验证”。 |
• |
有关模拟的详细信息,请参见本章后面的“模拟”。 |
• |
有关 URL 授权的详细信息,请参见本章后面的“URL 授权注意事项”。 |
• |
有关 Enterprise Services (COM+) 角色的详细信息,请参见“Enterprise Services Security一章。 |
不带模拟的 Windows 身份验证
下列配置元素显示了如何在Web.config.中明确声明启用不带模拟功能的 Windows(IIS) 身份验证。
<authentication mode="Windows" /> <!-- The following setting is equivalent to having no identity element --> <identity impersonate="false" />
可配置的安全性
当您使用不带模拟的 Windows 身份验证时,可以使用以下授权选项:
• |
WindowsACL
|
||||
• |
URL 授权。在 Web.config 中配置 URL 授权。在 Windows 身份验证中,用户名采用 DomainName/UserName 格式,并且角色与 Windows 组 一 对应。 <authorization> <deny user="DomainName/UserName" /> <allow roles="DomainName/WindowsGroup" /> </authorization> |
程序安全性
可以使用下列编程安全选项:
• |
主体权限要求
|
||||
• |
明确的角色检查。您可以使用IPrincipal 接口执行角色检查。 IPrincipal.IsInRole(@"DomainName/WindowsGroup"); |
何时使用
使用不带模拟的 Windows 身份验证的情况:
• |
应用程序的用户已经有了可以由服务器验证的 Windows 帐户。 |
• |
需要使用固定标识来访问下游资源(例如数据库)以便支持连接池。 |
更多信息
• |
有关 Windows 身份验证的详细信息,请参见本章后面的“Windows 身份验证”。 |
• |
有关 URL 授权的详细信息,请参见本章后面的“URL 授权注意事项”。 |
使用固定标识的 Windows 身份验证
Web.config 中的 <identity> 元素支持可选的用户名和密码属性,这样,您就可以为应用程序配置特定的固定标识以进行模拟。这显示在以下配置文件片段中。
<identity impersonate="true" userName="registry:HKLM/SOFTWARE/YourSecureApp/ identity/ASPNET_SETREG,userName" password="registry:HKLM/SOFTWARE/YourSecureApp/ identity/ASPNET_SETREG,password" />
这个例子显示了 <identity> 元素,其中凭证在注册表中使用 aspnet_setreg.exe 工具进行加密。明文形式的 userName 和 password 属性值被指向安全的注册表项和包含加密凭证的命名值的指针所替代。有关这个工具的详细信息及下载方式,请参见 Microsoft 知识库中的文件 Q329290 “HOWTO:Use the ASP.NET Utility to Encrypt Credentials and Session State Connection Strings”。
何时使用
当在运行 Windows 2000 的服务器上使用 .NET Framework 1.0 时,不建议使用固定的模拟标识。因为这需要您授予 ASP.NET 进程帐户“充当操作系统的一部分”权限,这个权限很大。 ASP.NET 进程需要这个权限,因为它使用您所提供的凭证执行 LogonUser 调用。
注 .NET 框架 1.1 版将在 Windows 2000 上提供此方案的改进版本。凭证将由 IIS 进程执行,这样 ASP.NET 就不需要“充当操作系统的一部分”权限了。
窗体身份验证
以下配置元素显示了如何在 Web.config 中以声明方式启用窗体身份验证。
<authentication mode="Forms"> <forms loginUrl="logon.aspx" name="AuthCookie" timeout="60" path="/"> </forms> </authentication>
可配置的安全性
在使用窗体身份验证时,可以使用以下授权选项:
• |
WindowsACL
|
||||
• |
URL 授权 在 Web.config 中配置 URL 授权。在窗体身份验证中,用户名的格式取决于自定义数据存储、SQL Server 数据库或 Active Directory。
|
程序安全性
可以使用下列编程安全选项:
• |
主体权限要求
|
||||
• |
明确的角色检查。您可以使用 IPrincipal 接口执行角色检查。 IPrincipal.IsInRole("Manager"); |
何时使用
窗体身份验证最适合于 Internet 应用程序。如果出现以下情况,则应该使用窗体身份验证:
• |
应用程序用户没有 Windows 帐户。 |
• |
您希望用户通过使用 HTML 窗体输入凭证的方式登录到应用程序。 |
更多信息
• |
有关窗体身份验证的详细信息,请参见本章后面的“窗体身份验证“。 |
• |
有关 URL 授权的详细信息,请参见本章后面的“URL 授权注意事项”。 |
Passport 身份验证
以下配置元素显示了如何在 Web.config 中以声明方式启用 Passport 身份验证。
<authentication mode="Passport" />
何时使用
如果应用程序用户没有 Windows 帐户,并且您希望实现单次登录解决方案,则应该在 Internet 上使用 Passport 身份验证。如果用户以前使用 Passport 帐户在参与的 Passport 站点进行登录,则不必登录到使用 Passport 身份验证配置的站点。
配置安全性
本节说明配置 ASP.NET Web 应用程序安全性所需的实际步骤。图 3 总结了这些情况。
图 3. 配置 ASP.NET 应用程序安全性
配置 IIS 设置
要配置 IIS 安全性,您必须执行以下步骤:
1. |
(可选)安装 Web 服务器证书(如果需要 SSL 的话)。 有关详细信息,请参见“How To Set Up SSL on a Web Server”。 |
2. |
本文地址:http://www.45fan.com/dnjc/71982.html