前 言 本书广泛讨论了与ASP.NET 2.0和ASP.NET 3.5安全相关的主题。本书首先介绍了Internet Information Services 7.0(IIS 7.0),然后详细解释IIS 7.0的Integrated执行模式。随后,本书详细讨论了在ASP.NET应用程序的启动过程中安全机制的作用机理,以及在最新引入的IIS 7.0集成请求处理管道中处理请求时,安全机制的作用机理。本书随后介绍了与信息安全有关的特性,如信任级别(trust level)、表单身份验证(Forms authentication)、会话状态(session state)、网页安全(page security)以及配置文件安全。您还可以了解到IIS 7.0的Integrated模式的优点,以及如何利用ASP.NET功能来处理非托管(non-managed)请求和本机(native)请求,例如classic ASP请求。IIS 7.0和ASP.NET可以协同工作,能够为您提供一个完整的请求处理管道,从而可以帮助您处理上述类型的请求。在学习上述主题的过程中,您还可以深入理解ASP.NET 2.0和ASP.NET 3.5中很少公开的安全功能。 本书从第10章开始着重介绍ASP.NET 2.0和ASP.NET 3.5的两项安全服务:成员资格和角色管理器。首先您将学习上述两项功能的基础——提供程序(provider)模型,然后将详细研究上述两项功能的内部机理,以及与其相关的基于SQL的提供程序和基于Active Directory的提供程序。掌握上述主题后,您可以深入理解如何使用上述提供程序完成工作,还可以了解如何在自己开发的应用程序中对上述功能进行扩展。随后,本书继续讨论ASP.NET的功能,并在第17章专门讨论了如何将ASP.NET的AJAX 3.5安全与ASP.NET 3.5的安全进行集成,从而说明了如何利用客户端编写的JavaScript代码对用户进行身份验证(authenticate)和授权(authorize)。 最后,本书用一章的篇幅讨论了ASP.NET开发人员必须遵守的最佳开发实践,通过遵循最佳实践,可以保证ASP.NET应用程序免受恶意攻击。 读者目标 本书主要面向的读者是开发人员,并要求读者具备良好的ASP.NET 1.1和ASP.NET 2.0安全概念基础,掌握表单身份验证、网页安全以及网站授权(website authorization)等内容。本书主要关注成员资格和角色管理器等内容,假定读者已经开始使用这些内容,并且很好地理解了上述内容所提供的一般功能。本书还假定读者对如何使用ASP.NET的AJAX 3.5具备一定经验,本书不打算重复介绍那些已经在API参考文献中广为介绍的功能。 读者将会发现,本书介绍的是各类ASP.NET安全功能的内幕,通过阅读本书,读者可以深入理解ASP.NET的安全机制。本书集中关注IIS 7.0及全新的Integrated执行模式,解释了新执行模式的重要性以及新模式为应用程序带来的好处。本书同时还解释了比较少见的安全功能(如ASP.NET的信任级别),通过学习这些内容,读者可以在自己的应用程序中使用相关的方法。 如果您需要大致了解IIS 7.0及其统一的集成请求处理管道,请阅读本书第1章和第2章的内容。如果您需要深入了解ASP.NET 2.0和ASP.NET 3.5的安全功能,请阅读本书第2章到第9章的内容。如果您需要了解成员资格和角色管理器等内容,关注本书第10章到第15章的内容。本书第17章讨论了ASP.NET的AJAX 3.5的身份验证和授权功能,说明了如何利用客户端编写的JavaScript代码进行身份验证和授权,这样可以充分借鉴他人的经验,开发出具有更快响应速度、更佳安全性的应用程序。最后,本书第18章介绍了ASP.NET所面临的一些其他类型的威胁和攻击,同时还提供了针对这些威胁的解决方案。 学习本书内容之后,读者将能够充分地理解ASP.NET安全的工作方式,还可以深入掌握如何充分利用ASP.NET 2.0和ASP.NET 3.5的功能,从而满足读者所开发的应用程序的安全需求。 本书的组织结构 与ASP.NET安全有关的主题包括大量不同的概念,如安全功能、最佳编码实践、锁定(lockdown)过程以及其他内容。本书从开发人员的角度研究ASP.NET安全功能,对开发人员在开发Web应用程序过程中可能遇到的各种ASP.NET安全功能进行了详细讨论,同时还说明了如何扩展或修改这些功能。 ● 第1章“IIS 7.0介绍”首先介绍了应用程序池和工作进程的新思路,基于这种新思路,本章深入说明了构成IIS 7.0的主要组件。然后,本章介绍了IIS 7.0的模块架构,还介绍了IIS 7.0提供的一系列本机模块和托管模块。在本章结尾,您将学习到IIS 7.0的两种处理模式,即Integrated处理模式和Classic处理模式。 ● 第2章“IIS 7.0和ASP.NET的Integrated模式”首先介绍了使用IIS 7.0和Integrated处理模式的优点,然后进一步讨论了Integrated处理模式的内部机制和架构。此外,本章还说明了开发人员和管理人员在升级应用程序使之能够运行在IIS 7.0的Integrated模式下的过程中所面临的迁移问题。本章最后使用一节的篇幅说明了如何扩展IIS 7.0的基础设施,为了完成扩展工作,这一节内容开发了托管的HttpHandler处理程序和HttpModule模块,并在应用程序的web.config配置文件中完成了这些功能的安装,因此用户不需要再访问IIS 7.0 Manager工具。 ● 第3章“IIS 7.0的Integrated模式中的HTTP请求处理”首先介绍了IIS 7.0内置的IUSR帐户和IIS_IUSRS组,然后详细说明了IIS 7.0和ASP.NET在统一的集成请求处理管道中的安全处理过程,本书在此不仅详细介绍了统一的请求处理管道及其涉及的所有事件和步骤,而且还着重介绍了某些重要的步骤。您可以看到默认的身份验证和授权模块是如何完成工作的,以及IIS 7.0的新技术是如何基于IIS 7.0的新增配置设置来阻止对某些内容的访问的。本章专门使用一节的篇幅说明了新增的UrlAuthorizationModule模块,这个模块是一个随IIS 7.0一同发行的本机模块。在ASP.NET 2.0和ASP.NET 3.5的异步管道事件(asynchronous pipeline event)和异步网页模型(asynchronous page model)中使用请求标识(request identity)时,必须注意一些微妙之处,本章专门介绍了这种微妙之处。 ● 第4章“信任问题”描述了什么是ASP.NET的信任级别,还说明了ASP.NET的信任级别是如何为运行中的Web应用程序提供更为安全的运行环境的。本章详细探讨了如何自定义信任级别,以及如何编写在部分信任(partial trust)应用程序中运行的特权代码(privileged code)。 ● 第5章“配置系统的安全”覆盖了与2.0版和3.5版.NET Framework中所有安全功能配置系统有关的内容。本章讨论了用于锁定配置节的配置选项,还讨论了如何保护配置节免受窥探。本章讨论了如何管理IIS 7.0和ASP.NET的配置系统,并且简单介绍了IIS 7.0的功能委托(feature delegation),利用IIS 7.0的功能委托,管理人员可以指定ASP.NET应用程序能够改用或修改的IIS 7.0配置节。本章还讨论了ASP.NET的信任级别与配置系统安全是如何协同工作的。 ● 第6章“表单身份验证”解释了ASP.NET 2.0和ASP.NET 3.5为表单身份验证提供的支持。您将学习IIS 7.0如何在不使用cookie的情况下为Integrated模式提供支持,还将学习表单身份验证如何在不同的Web应用程序之间传递身份验证票证(ticket)。本章同时给出了一个示例,这个示例实现了一个轻量级的单一登录(Single Sign On,SSO),同时说明了如何组合使用表单身份验证和成员资格来完成单一登录。 ● 第7章“将ASP.NET安全与Classic ASP进行集成”说明了如何使用IIS 7.0通配符映射以及ASP.NET 2.0和ASP.NET 3.5对通配符映射的支持,这样,当一个ASP.NET应用程序在IIS 7.0的Classic模式下运行时,可以与Classic ASP应用程序共享身份验证和授权信息。本章说明了将ASP.NET安全与Classic ASP或其他非托管内容进行集成是一项非常容易的工作,只需使用IIS 7.0提供的Integrated模式就可以完成该任务。本章最后详细讨论了如何使一个运行在IIS 7.0的Integrated模式下的ASP.NET应用程序,利用ASP.NET的成员资格和角色管理器功能对classic ASP内容进行身份验证和授权。 ● 第8章“会话状态”关注与会话状态有关的安全特性和安全指南。本章介绍了ASP.NET 2.0和ASP.NET 3.5中的会话状态功能,还介绍了针对进程外状态的安全保护措施,并介绍了ASP.NET信任级别对会话状态功能的影响。此外,本章还详细讨论了如何为运行在IIS 7.0的Integrated模式下的ASP.NET应用程序中的非托管内容启用会话状态。 ● 第9章“网页安全和编译安全”描述了一些在ASP.NET 1.1中很少有人了解的网页安全特性。同时,本章还描述了在ASP.NET 2.0和ASP.NET 3.5中如何确保视图状态(viewstate)和回发(postback)事件的安全。本章还介绍了 ASP.NET 3.5提供的动态编译模型,该模型最早是由ASP.NET 2.0引入的,动态编译模型可以用于保证代码访问的安全。 ● 第10章“提供程序模型”概述了ASP.NET 2.0和ASP.NET 3.5中的提供程序架构。本章介绍了构成“提供程序模型”的各种.NET Framework类,还给出了相关代码,这些内容可以指导用户编写基于提供程序的自定义功能。 ● 第11章“成员资格”介绍了ASP.NET 2.0和ASP.NET 3.5中的成员资格功能,深入介绍了成员资格功能的核心类,还介绍了如何使用自定义的散列(hash)算法对成员资格功能进行扩展。 ● 第12章“SqlMembershipProvider”深入研究了SqlMembershipProvider和常用的数据库设计知识,这些内容可以作为ASP.NET 2.0和ASP.NET 3.5中基于SQL的功能的组成部分。在这一章中,您将学习到如何对提供程序进行扩展,使之能够对用户帐户进行自动解锁。示例代码还介绍了如何对自定义密码进行加密,如何保存密码历史,以及如何对提供程序进行扩展,使之能够在门户(portal)环境下工作。 ● 第13章“ActiveDirectoryMembershipProvider”介绍了另一个提供程序——ActiveDirectory- MembershipProvider,这个提供程序是随ASP.NET 2.0和ASP.NET 3.5一同发行的。您将学习到这个提供程序是如何将其功能映射到Active Directory的,还将学习到如何设置Active Directory和Active Directory 轻型目录服务(由Windows Server 2008引入)服务程序,使之能够与提供程序协同工作。 ● 第14章“角色管理器”描述了角色管理器功能,此功能为ASP.NET 2.0和ASP.NET 3.5提供了内置的授权支持。您将学习到角色管理器的核心类。本章还说明了RoleManager- Module是如何自动为下游(downstream)授权设置主体(principal)的,以及模块和角色管理器的缓存是如何紧密协作完成任务的。本章还讨论了WindowstokenRoleProvider提供程序,该提供程序是随角色管理器功能一同发行的。 ● 第15章“SqlRoleProvider”讨论了SqlRoleProvider及其内部信息架构(schema)。您将学习到如何与Windows身份验证协同使用提供程序,还将学到如何对提供程序进行扩展,使之能够支持自定义的授权逻辑。本章还介绍了如何为数据层授权逻辑使用数据库信息架构。本章内容不仅限于讨论SqlRoleProvider,还讨论了如何使提供程序在部分信任的非ASP.NET环境中正常工作。 ● 第16章“AuthorizationStoreRoleProvider”讨论了提供程序AuthorizationStoreRole- Provider,该提供程序将角色管理器的功能映射到授权管理器(Authorization Manager)功能,授权管理器最早是随Windows Server 2003一同发行的,现在是Windows Server 2008的组成部分。您还将学习如何利用提供程序设置并使用基于文件和基于目录的策略存储(policy store)。本章还介绍了由提供程序支持的授权管理器特殊功能,以及如何使用ActiveDirectoryMembershipProvider和AuthorizationStoreRoleProvider在您开发的Web应用程序中提供基于Active Directory的身份验证和授权。 ● 第17章“ASP.NET AJAX 3.5中的成员资格和角色管理”讨论了ASP.NET AJAX 3.5如何与ASP.NET 3.5的成员资格和角色管理器功能进行集成,集成时,需要使用新引入的Web服务充当与ASP.NET应用程序服务的接口。本章首先重新归纳了ASP.NET 2.0和ASP.NET 3.5的成员资格和角色管理器功能。然后讨论了如何令现有的ASP.NET应用程序使用ASP.NET AJAX 3.5,以及如何在应用程序中启用客户端身份验证和角色服务。本章在结尾处分析了ASP.NET AJAX的身份验证和角色服务,给出了当ASP.NET AJAX 3.5与ASP.NET应用程序服务协同工作时,在服务器端和客户端使用的所有类的详情。 ● 第18章“保证ASP.NET Web应用程序安全性的最佳实践”介绍了在确保ASP.NET Web应用程序安全的过程中需要遵循的最佳实践。本章讨论内容是以最佳实践列表的形式出现的,读者可以在自己的Web应用程序中,遵循并应用列表中给出的最佳实践。本章详细解释了各项最佳实践,尽可能地给出了示例代码。本章最后介绍了由于在应用程序中引入AJAX技术后,应用程序中可能出现的漏洞,以及如何为这些情况提供最佳安全方案。 阅读本书过程中所需的软件环境 使用本书中的示例时,需要使用.NET Framework 3.5和.NET Framework 3.5 SP1,使用的操作系统平台是Windows Vista 和Windows Server 2008。本书所介绍的代码示例都已经基于Windows Vista平台的.NET Framework 3.5和.NET Framework 3.5 SP1进行了验证。为了运行本书中提供的所有代码示例,需要以下几项: ● Windows Server 2008或Windows Vista ● Internet Information Services 7.0(IIS 7.0) ● Visual Studio 2008 RTM ● SQL Server 2000或SQL Server 2005 ● 运行在Windows Server 2008功能级别(functional level)的Windows Server 2008域 本书给出的大多数代码示例都能够在Windows Server 2008平台上正常运行,因为随Windows Vista 和Windows Server 2008发行的IIS 7.0是相同的。注意,本书大多数内容都使用了IIS 7.0应用程序池安全凭据(credential)配置。 学习本书所有内容都需要安装IIS 7.0。 本书第12章和第15章使用了基于SQL的提供程序,因此为了使用本书的示例,您必须安装SQL Server 2000或SQL Server 2005,本书其他部分所用的示例都需要使用成员资格功能,这些示例也需要使用SQL Server 2000或SQL Server 2005。 为了运行本书第13章的示例,必须使用一个Windows Server 2008域控制器,或者使用一台运行Active Directory轻型目录服务(ADLDS)或Application Mode(ADAM)的计算机。本书第13章解释了如何在Active Directory和ADLDS环境中使用ActiveDirectoryMembershipProvider。 第16章的代码使用了Windows Server 2008的授权管理器功能(既需要设置策略,也需要消费策略)。因此,为了运行大多数示例,必须使用一个Windows Server 2008域控制器,并且必须将这个Windows Server 2008域控制器设置为能够与授权管理器协同工作。针对基于文件的策略存储,如果仅基于AuthorizationStoreRoleProvider使用基于文件的策略存储,则不需要使用域控制器。此外,Windows Server 2008还进一步丰富了授权管理器的功能,提供了在Microsoft SQL Server保存授权信息的功能,因此,为了学习如何在Windows Server 2008中使用这项功能,还必须安装SQL Server 2000或SQL Server 2005。 本书约定 本书将使用两种方式来表示代码: (1) 本书大多数情况下都使用monofont字体表示代码示例。 (2) 表示代码示例时,如果代码在上下文环境中特别重要,那么用灰色背景体现这段代码的重要性。 源代码 读者在阅读本书提供的代码时既可以亲自键入所有代码,也可以使用随书提供的代码文件。本书所有代码均可以从网站下载。进入该网站后,请读者根据本书的书名查找本书(读者既可以使用搜索框进行查找,也可以使用书名列表进行查找),然后单击本书详细内容页面上提供的Download Code链接,就可以下载本书提供的所有代码。 注意: 因为许多书籍名称与本书类似,因此读者也可以通过ISBN进行查找,本书的ISBN为:978-0-470-37930-1。 下载代码后,读者可以利用一种压缩工具将代码解压。此外,读者还可以通过访问网站/dynamic/books/download.aspx中提供的Wrox代码下载页面来获取本书提供的代码,也可以下载Wrox出版的其他书籍提供的代码。 勘误表 为了避免本书文字和代码中存在错误,我们已经竭尽全力。然而,就如世界上不存在完美无缺的事物,本书仍然可能存在错误。如果读者在我们编写的书籍中发现了诸如拼写错误或代码缺陷等问题,那么请告诉我们,我们对此表示感谢。利用勘误表反馈错误信息,可以为其他读者节省大量时间,同时,我们也能够受益于读者的帮助,这样有助于我们编写出质量更高的专业著作。 如果读者需要参考本书的勘误表,请在网站中用搜索框或书名列表查找本书书名。然后,在本书的详细内容页面上,单击Book Errata链接。在随后显示的页面中,读者可以看到与本书相关的所有勘误信息,这些信息是由读者提交、并由Wrox的编辑们加上的。通过访问/misc-pages/booklist.shtml,读者还可以看到Wrox出版的所有书籍的勘误表。 如果读者没有在Book Errata页面上找到其发现的错误,那么请读者转到页面/contact/techsupport.shtml,针对您所发现的每一项错误填写表格,并将表格发给我们,我们将对表格内容进行认真审查,如果确实是我们书中的错误,那么我们将在该书的Book Errata页面上标明该错误信息,并在该书的后续版本中改正相关错误。 关于 如果读者希望能够与作者进行讨论,或希望能够参与读者的共同讨论,那么请加入的论坛。这个论坛是一个基于Web的系统,读者可以在论坛发表与Wrox出版的书籍有关的技术信息,并与其他读者和技术用户进行讨论。论坛提供了订阅功能,可以将与读者所选主题相关的新帖子定期发送到读者的电子邮箱。Wrox的作者、编辑、业界专家以及其他读者都会参与论坛中的讨论。 读者可以在参与多个论坛的讨论,这些论坛不仅能够帮助读者更好地理解本书,还有助于读者更好地开发应用程序。如果读者希望加入论坛,那么请读者按照以下步骤执行: (1) 进入页面,单击Register链接。 (2) 阅读使用条款,然后单击Agree。 (3) 填写必要的信息(必要时也需要填写可选信息),然后单击Submit。 (4) 随后读者会收到一封电子邮件,邮件中说明了如何验证帐号并完成整个加入过程。 注意: 要阅读论坛信息,读者无须加入P2P。但是如果读者需要发表主题或发表回复,那么读者必须加入论坛。 成功加入论坛后,读者就可以发表新主题了。此外,读者还可以回复其他主题。读者在任何时间都可以阅读论坛信息。如果读者需要论坛将新的信息发送到自己的电子邮箱,那么可以单击论坛列表中论坛名称旁的Subscribe to this Forum图标完成该功能设置。 如果读者需要获得更多与Wrox P2P相关的信息,请阅读P2P FAQs,这样可以获得大量与P2P和Wrox出版的书籍相关的具体信息。阅读FAQs时,请单击P2P 页面上的FAQs链接。