日期:2013-10-22  浏览次数:20439 次

摘要
本文讨论了设计服务器应用程序时考虑安全性的重要性。Internet Information Services 和 ASP .NET 均提供了安全模型,以便您对用户进行适当的身份验证,并在应用程序中获得正确的安全环境。

--------------------------------------------------------------------------------

目录
简介
安全性考虑
IIS 和 ASP .NET 之间的关系
身份验证方法
Web 服务的安全性
代码访问安全性
通道安全性
其他信息
附录 A

--------------------------------------------------------------------------------

简介
不论对应用程序设计者还是开发人员,安全性都是关注的主要问题。您需要保护存储敏感信息的应用程序,既要防止恶意攻击,又要防止竞争对手窃取信息或知识产权。在为您的应用程序设计安全模型时,您需要从业务角度了解安全要求,以及选定的安全模型在性能、可伸缩性和部署上所具有的含义。

--------------------------------------------------------------------------------

安全性考虑
如果您在设计服务器应用程序,那么您的设计规范应包含一个解决安全问题的部分。在应用程序的功能规范中,您应当考虑以下项目并尽可能给出解决方案:
安全目标。理解您要保护的对象并确保您可以说明它。
安全风险。理解您的应用程序的弱点。您还必须理解这些弱点对业务的潜在危害程度。
身份验证。这一过程接受用户凭据,并根据指定的颁发机构来验证凭据。用户的(或者潜在的应用程序或计算机的)标识被称为安全当事者。客户端必须提供凭据,以便服务器验证当事者的标识。确认标识后,应用程序就能授权当事者访问系统资源。本文档的下一节将讲述各种标准,它们有助于您选择恰当的身份验证机制。
权限。这一过程确定已证实的标识是否可以访问某一特定资源。
保护数据传输。在数据通过网络时对数据进行加密,可以确保数据在传输过程中不被查看和修改。您必须考虑传输过程中需要的数据加密级别。
模拟。这一机制允许服务器进程使用客户端的安全凭据来运行。当服务器模拟客户端时,服务器的所有操作均使用客户端的凭据进行。模拟不允许服务器代表客户端访问远程资源。该操作需要使用代理。
代理。和模拟一样,代理允许服务器进程使用客户端的安全凭据来运行。但是,代理的功能更加强大,它允许服务器进程以客户端方式来呼叫其他计算机。
操作系统安全性。它指建立适当的访问控制列表 (Access Control List, ACL) 和网络安全措施,以防止入侵者访问受保护的资源。您必须为适当的资源设置适当的 ACL,从而只允许相关的当事者进行访问。
保护物理访问。是指将您的服务器计算机放在一个安全的房间中。您不应忽视这个基本问题。
代码访问安全性。它允许根据代码的来源及代码标识的其他特征来确定代码的可信度。您应当了解如何创建自己的访问许可。

--------------------------------------------------------------------------------

IIS 和 ASP .NET 之间的关系
在设计应用程序时,您应理解 Internet Information Services (IIS) 身份验证和 Microsoft ASP .NET 安全结构之间的关系。这将允许您恰当地验证您的用户,并在应用程序中获得正确的安全环境。请注意,ASP .NET 应用程序的安全配置和 IIS 的安全配置是完全独立的,它们可以单独使用,也可以结合使用。
IIS 在 IIS 元数据库中维护与安全性相关的配置设置,而 ASP .NET 在 XML 配置文件中维护安全(或其他)配置设置。这一般会在安全性方面简化应用程序的部署,但应用程序采用的安全模型则需要通过配置文件 (Web.config) 正确配置 IIS 元数据库和您的 ASP .NET 应用程序。
图 1 说明了 IIS 和 ASP .NET 之间的关系。


图 1:IIS 和 ASP .NET 之间的安全性关系
ASP .NET 身份验证提供程序和 IIS 安全性
ASP .NET 通过使用身份验证提供程序来实现身份验证,身份验证提供程序是验证凭据和实现其他安全功能(例如生成 Cookie)的代码模块。ASP .NET 支持以下三种身份验证提供程序:
表单身份验证。使用该提供程序,可以使用客户端重定向将未通过身份验证的请求重定向到指定的 HTML 表单。然后,用户可以提供登录凭据,并将表单发送回服务器。如果应用程序验证了请求(使用应用程序特定的逻辑),ASP .NET 将发出一个 Cookie,其中包含凭据或用于重新申请客户标识的密钥。后续发出的请求在标头携带该 Cookie,这就意味着以后不再需要身份验证。
Passport 身份验证。这是一个由 Microsoft 提供的集中身份验证服务,它为参与的站点提供单一的登录程序和成员服务。ASP .NET 与 Microsoft Passport 软件开发包 (SDK) 相结合,为 Passport 用户提供了类似表单身份验证的功能。
Windows 身份验证。该提供程序利用了 IIS 的身份验证功能。当 IIS 完成身份验证后,ASP .NET 使用已验证标识的标记来授权访问。
要在 ASP .NET 应用程序中使用某种指定的身份验证提供程序,您必须在应用程序配置文件中创建如下项:
// web.config 文件
<authentication mode = "[Windows/Cookie/Passport/None]">
</authentication>
除身份验证外,ASP .NET 还提供了模拟机制以建立应用程序线程的安全标记。能否获得正确的标记取决于您是否恰当地配置了 IIS 身份验证、ASP .NET 身份验证提供程序和 ASP .NET 模拟设置。图 2 显示了 IIS 身份验证和 ASP .NET 提供程序之间最可能的组合。


图 2:ASP .NET 和 IIS 安全设置矩阵
使用 Windows 帐户进行身份验证
如果您计划使用 Microsoft Windows NT 域控制器或 Microsoft Windows 2000 Active Directory 帐户来进行用户身份验证,您应当结合使用 IIS 身份验证和 ASP .NET Windows 提供程序(见图 2)。使用该方法,您不必编写任何特定身份验证代码。当使用该方法验证时,ASP .NET 根据已验证用户在应用程序环境中构造并附加一个 Windows Principal 对象。这样,ASP .NET 线程就能够作为已验证用户运行,并可获得用户的组成员身份。
在某些情况下,您可能希望忽略 IIS 身份验证,而实施自定义的解决方案。使用 ASP .NET 也可以实现这一目标。例如,您可以编写自定义 ISAPI 过滤器,根据 Active Directory 检查用户凭据,并手动创建 Windows Principal 对象。除这种方法外,还有其他一些方法可以使用,但是与直接使用 .NET 提供程序相比,它们都需要编写更多的代码。
使用非 Windows 帐户进行身份验证
如果您计划在应用层进行用户身份验证,并且用户没有 Windows 帐户,则一般应将 IIS 配置为使用匿名验证。在这种配置下,请考虑以下 .NET 身份验证模块:
无:在根本不验证用户时或开发自定义验证代码时使用。
表单:在需要为用户提供登录页时使用。
Passport:在使用 Passport 服务时使用。
模拟和代理
在模拟情况下,ASP .NET 应用程序能够使用客户端标识以客户端的身份有选择地执行。模拟一般用于资源访问控制。您应仔细考虑是否需要模拟,因为它将消耗额外的服务器资源。代理是一种比模拟更强大的形式,它允许服务器进程以客户端的身份访问远程资源。
如果启用模拟,ASP .NET 将从 IIS 收到模拟标记。与传统的 Active Server Pages (ASP) 相比,使用 ASP .NET 将使您在 Web 应用程序中更广泛地控制模拟。这种控制是通过在应用程序的 Web.config 文件中指定值来实现的。
在指定所需的模拟设置时,有以下三个选项:
启用模拟。在这种情况下,ASP .NET 将模拟由 IIS 传递给它的标记,该标记可能是已验证的用户,也可能是匿名 Internet 用户帐户。
<identity impe