ASP.NET Web 应用程序身份验证和授权机制(二)

[ 2515 查看 / 3 回复 ]

授权方法 有两种基本授权方法:
基于角色。用户被划分为应用程序定义的逻辑角色。在应用程序中,某一特定角色的成员将共享相同的权限。对操作(通常由方法调用表示)的访问是根据调用方的角色成员身份进行授权的。 使用固定标识(例如 Web 应用程序的或 Web 服务的进程标识)访问资源。资源管理器信任应用程序可以正确授权用户,并且它们将权限授予“受信任”的标识。
基于资源。各个资源是通过 Windows ACL 得到保护的。ACL 决定了哪些用户可以访问资源,还决定每个用户可以执行哪类操作(读取、写入、删除等)。 使用原调用方标识(使用模拟)来访问资源。
基于角色的授权在基于角色(或操作)的安全方法中,对操作(而非后端资源)的访问是根据调用方的角色成员身份进行授予的。角色(在设计应用程序时进行分析并加以定义)被用作逻辑容器,它们将应用程序中共享同一安全权限(或功能)的用户集合在一起。用户被映射到应用程序中的角色,而角色成员身份用来控制对应用程序公开的特定操作(方法)的访问权。 在应用程序的什么位置映射角色是设计中需要考虑的一个关键因素;例如
第一种情况是,可以在后端资源管理器(如数据库)中映射角色。它要求将原调用方的安全性上下文通过应用程序的各层一直传递到后端数据库。
另一种情况是在前端 Web 应用程序中映射角色。如果是运用这种方法,那么就要通过固定标识来访问下游资源管理器,而这些资源管理器对这些标识进行了授权并愿意信任它们。
第三种选择是在前端层和后端层之间的某个位置进行角色映射;例如:在中间层企业服务应用程序中。
在多层 Web 应用程序中,使用受信任的标识访问后端资源管理器为应用程序的伸缩性提供了更多的机会(这得归功于连接池)。另外,使用受信任的标识减少了在操作系统级传递原调用方安全性上下文的需要,而这本来可能是不太可能(即使可能,也是很难)实现的。 基于资源的授权基于资源的授权方法依赖于 Windows ACL 和操作系统的基本访问控制机制。应用程序模拟调用方,将执行访问检查的任务留给了与特定资源管理器(文件系统、数据库等)关联的操作系统。 这种方法通常最适合于以下应用程序:您利用它们来访问可通过 Windows ACL 加以个别保护的资源(如文件资源)。FTP 应用程序或简单的数据驱动 Web 应用程序就属于这类应用程序。如果被请求资源中的数据需要从多个不同来源(如多个数据库、数据库表、外部应用程序或 Web 服务等)获取和合并,那么这种方法就显得力不从心了。 基于资源的方法还依赖于传递到应用程序后端资源管理器的原调用方的安全性上下文。这可能需要进行复杂的配置,而且会大大降低多层应用程序增加受访的能力,因为使用这种方法,您就无法在应用程序中间层有效运用集合功能(如数据库连接池)。 资源访问模型通过研究 .NET Web 应用程序(以及通常所见的分布式多层应用程序)最常用的两种资源访问安全模型,我们可以看到有两种截然不同的授权方法。这两种模型是:
受信任的子系统模型
模拟/委派模型
这两种模型在安全性和可伸缩性方面都各有优缺点。以下各节将介绍这两种模型。 受信任的子系统模型在此模型中,中间层服务使用固定标识访问下游服务和资源。原调用方的安全性上下文不通过操作系统级的服务进行传递,但应用程序可以选择在应用程序级传递原调用方标识。它这样做可能是需要支持后端审核要求,或支持按用户访问数据和授权。 该模型之所以得此名称,是因为下游服务(或许是数据库)信任上游服务,让其授权调用方。图 3.1 显示了此模型。请特别注意信任边界。在本示例中,数据库“信任”中间层让其授权调用方,并只允许经过授权的调用方使用受信任的标识访问数据库。 图 3.1 受信任的子系统模型 在受信任的子系统模型中,资源访问步骤如下:
对用户进行身份验证
将用户映射到角色
根据角色成员身份进行授权
使用固定的受信任标识访问下游资源管理器
固定标识用于访问下游系统和资源管理器的固定标识通常由预配置的 Windows 帐户(称为服务帐户)提供。在 Microsoft SQL Server™ 资源管理器中,这意味着对 SQL Server 使用 Windows 身份验证。 另一种情况是,某些应用程序使用指定的 SQL 帐户(由连接字符串中的用户名和密码指定)访问 SQL Server。在这种情况下,必须对数据库进行配置,以使用 SQL 身份验证。 有关与 SQL Server 通信时 Windows 身份验证和 SQL 身份验证的相对优点,请参见第 12 章数据访问安全性。 使用多个受信任的标识有些资源管理器可能需要根据调用方的角色成员身份,执行更进一步细分的授权。例如,您可能有两组用户,一组应被授权执行读取/写入操作,另一组则应被授权执行只读操作。 请看下面的 SQL Server 方法:
创建两个 Windows 帐户,一个用于读取操作,一个用于读取/写入操作。 通常,使用不同的帐户映射特定于应用程序的角色。例如,您最好让 Internet 用户使用一个帐户,而让内部操作员和/或管理员使用另一个帐户。
将每个帐户映射到一个 SQL Server 用户定义的数据库角色,并且为每个角色建立必要的数据库权限。
将用户映射到应用程序中的角色,并在连接到数据库之前使用角色成员身份确定所要模拟的帐号。
图 3.2 中显示了这一方法。 图 3.2 使用多种标识访问数据库以支持更细分的授权 模拟/委派模型在此模型中,服务或组件(通常在逻辑业务服务层中的某个位置)在访问下一个下游服务之前模拟客户端的标识(使用操作系统级模拟)。如果下一个服务在同一台计算机上,模拟就足够了。如果下游服务位于远程计算机上,则需要使用委派。 委派的结果是,用于访问下游资源的安全性上下文是客户端的安全性上下文。使用此模型通常是由于以下几种原因:
它允许下游服务借助原调用方标识来按调用方进行授权。
它允许下游服务使用操作系统级审核功能。
这一方法的一个具体示例是,中间层企业服务组件可能会在访问数据库之前模拟调用方。将使用依赖于原调用方的安全性上下文的数据库连接访问数据库。在此模型中,数据库对每个调用方进行身份验证,并基于指派给各调用方的标识(或调用方的 Windows 组成员身份)的权限做出授权决定。图 3.3 显示了模拟/委派模型。 图 3.3 模拟/委派模型 选择资源访问模型绝大多数 Internet 应用程序和大规模的 Intranet 应用程序都使用受信任的子系统模型,其主要原因是可伸缩性。模拟模式往往用于可伸缩性不是主要问题的小规模应用程序和那些审核(由于不可否认性原因)是关键问题的应用程序。 模拟/委派模型的优点模拟/委派模型最主要的优点是审核(接近数据)。审核允许管理员跟踪试图访问特定资源的用户。通常情况下,如果审核是在资源访问的精确时间、由访问资源的同一例程产生的,则认为审核最具权威性。 模拟/委派模型为下游资源访问维护用户的安全性上下文,从而为此提供支持。这允许后端系统权威性地记录用户和所请求的访问。 模拟/委派模型的缺点与模拟/委派模型有关的缺点包括:
技术挑战。大多数安全服务提供程序不支持委派,Kerberos 是个重要的例外。 执行模拟的进程需要更高的权限(具体说就是“作为操作系统一部分”权限)。(此限制适用于 Windows 2000,对 Windows .NET Server 并不适用)。
可伸缩性。模拟/委派模型意味着您无法高效地使用数据库连接池,因为访问数据库时所使用的连接与原调用方的不同安全性上下文密切相关。这极大限制了应用程序扩展到大量用户的能力。
更多管理工作。维护后端资源上的 ACL 时,需要授予每一个用户适当的访问级别。随着后端资源的数量增加(因此用户数量也增加)时,需要执行大量的工作来管理 ACL。
受信任的子系统模型的优点受信任的子系统模型具有以下优点:
可伸缩性。受信任子系统模型支持连接池,这是应用程序可伸缩性的一项基本要求。连接池允许多个客户端重用可用的池连接。它非常适合于此模式,因为无论调用方的标识是什么,对后端资源的所有访问都将使用服务帐户的安全性上下文。
后端 ACL 管理工作减到最少。只有服务帐户访问后端资源(例如数据库)。仅针对此标识来配置 ACL。
用户无法直接访问数据。在受信任的子系统模型中,只有中间层服务帐户才有权访问后端资源。因此,如果用户不通过应用程序(并且以应用程序授权为准),就无法直接访问后端数据。
受信任的子系统模型的缺点受信任的子系统模型有几个缺点:
审核。要在后端执行审核,可以(在应用程序级)将原调用方标识以明文方式传递到后端,并在那里执行审核。您必须信任中间层,而且确实有潜在的拒绝风险。或者,可以在中间层生成审核记录,然后将它与后端审核记录相关联(为此,必须确保服务器时钟是同步的)。
增加了服务器攻击危险。在受信任的子系统模型中,中间层服务被授予对后端资源的广泛访问权限。因此,存在安全隐患的中间层服务可能使攻击者更容易获得对后端资源的广泛访问权限。
传递标识 分布式应用程序可划分为多个安全子系统。例如,前端 Web 应用程序、中间层 Web 服务、远程组件和数据库代表 4 个不同的安全子系统。每个安全子系统都执行身份验证和授权。 必须识别以下子系统:它们必须将调用方的标识(以及相关的安全性上下文)传递到下一个下游子系统,以便针对原调用方进行授权。 应用程序和操作系统标识传递对比标识传递策略包括使用操作系统的委派功能或在应用程序级传递票证和/或凭据。例如:
要在应用程序级传递标识,一般使用方法参数或存储过程参数传递凭据(或票证)。 注意:携带已通过身份验证的调用方的标识的 GenericPrincipal 对象不会在进程间自动传递。这需要自定义代码。 可以向存储过程传递允许您检索和处理特定用户数据的参数。例如: SELECT CreditLimit From Table Where UserName="Bob"此方法有时称为“受信任的查询参数”方法。
操作系统标识传递需要采用委派,它是模拟的一种扩展形式。
模拟与委派在通常情况下,服务器应用程序中的线程使用服务器进程的安全性上下文运行。组成进程安全性上下文的属性由进程的登录会话维护,并由进程级 Windows 访问令牌公开。访问本地资源和远程资源时均将使用进程级安全性上下文(由用于运行服务器进程的 Windows 帐户决定)。 模拟为服务器应用程序配置了模拟后,模拟令牌附加到用于处理请求的线程上。模拟令牌代表已通过身份验证的调用方(或匿名用户)的安全性上下文。访问本地资源时均将使用线程模拟令牌(导致使用调用方的安全性上下文)。 委派如果服务器应用程序线程试图访问远程资源,则需要委派。具体说来,被模拟的调用方的令牌必须有网络凭据。如果没有,所有远程资源访问都将以匿名用户 (AUTHORITY\ANONYMOUS LOGON) 的身份执行。 有许多因素决定是否可以委派安全性上下文。表 3.1 显示了各种 IIS 身份验证类型,并且对于每一种类型指出了是否可以委派已通过身份验证的调用方的安全性上下文。 表 3.1:IIS 身份验证类型
身份验证类型能否委派备注
匿名 视情况而定 如果匿名帐户(默认情况下是 IUSR_MACHINE)在 IIS 中被配置为本地帐户,则除非本地(Web 服务器)计算机和远程计算机有相同的本地帐户(具有匹配的用户名和密码),否则就不能委派它。 如果匿名帐户是域帐户,则可以委派它。
基本 如果对本地帐户使用“基本”身份验证,并且本地和远程计算机上的本地帐户相同,则可以委派它。域帐户也可以委派。
摘要式
集成 Windows 视情况而定 集成 Windows 身份验证将导致 NTLM 或 Kerberos(具体取决于客户机和服务器的操作系统版本)。 NTLM 不支持委派。 Kerberos 支持有适当配置环境的委派。 有关详细信息,请参见本指南中的如何为 Windows 2000 实现 Kerberos 委派。
客户端证书 视情况而定 如果与 IIS 证书映射一起使用,并且证书映射到一个在远程计算机重复的本地帐户或映射到域帐户,则可以委派。 它起作用是因为所映射帐户的凭据存储在本地服务器上,并且用于创建交互式登录会话(有网络凭据)。 Active Directory 证书映射不支持委派。
重要说明:Windows 2000 下的 Kerberos 委派不受限制。也就是说,用户或许能在多台远程计算机之间制造多个网络跃点。为消除这种潜在的安全风险,应该限制域帐户的访问范围,方法是从“域用户”组中删除此帐户,只允许使用此帐户登录到特定的计算机。
最后编辑Jason 最后编辑于 2008-08-23 07:04:57
本主题由 版主 Jason 于 2008-8-23 6:58:34 执行 设置精华/取消 操作
TOP

回复:ASP.NET Web 应用程序身份验证和授权机制(二)

支持
TOP

回复 2F zhanglx 的帖子

  学习中........ 有一点补充 .身份验证概念 任何成功的应用程序安全策略的基础都是稳固的身份验证和授权手段,以及提供机密数据的保密性和完整性的安全通讯。 身份验证(authentication)是一个标识应用程序客户端的过程,这里的客户端可能包括终端用户、服务、进程或计算机,通过了身份验证的客户端被称为主体(principal)。身份验证可以跨越应用程序的多个层发生。终端用户起初由Web应用程序进行身份验证,通常根据用户名和密码进行;随后终端用户的请求由中间层应用程序服务器和数据库服务器进行处理,这过程中也将进行身份验证以便验证并处理这些请求。 图1列出了各种安全技术以及每种技术所提供的主要验证方式。 2. 身份验证模式 如图1所示,Windows 2000上的.NET框架上提供了以下几种身份验证: ASP.NET身份验证模式 Enterprise Services身份验证 SQL Server身份验证 2.1 ASP.NET身份验证模式 ASP.NET身份验证模式包括Windows、Forms(窗体)、Passport(护照)和None(无)。 2.1.1 Windows身份验证 使用这种身份验证模式时,ASP.NET依赖于IIS对用户进行验证,并创建一个Windows访问令牌来表示已通过验证的标识。IIS提供以下几种身份验证机制: 基本身份验证简要身份验证集成Windows身份验证证书身份验证匿名身份验证 2.1.2 护照身份验证 使用这种身份验证模式时,ASP.NET使用Microsoft Passport的集中式身份验证服务,ASP.NET为Microsoft Passport软件开发包(SDK)所提供的功能提供了一个方便的包装(Wrapper)。此SDK必须安装在WEB服务器上。 2.1.3 窗体身份验证 这种验证方式使用客户端重定向功能,将未通过身份验证的用户转发到特定的登录窗体,要求用户输入其凭据信息(通常是用户名和密码)。这些凭据信息被验证后,系统生成一个身份验证票证(ticket)并将其返回客户端。身份验证票证可在用户的会话期间维护用户的身份标识信息,以及用户所属的角色列表(可选)。 2.1.4 None 使用这种身份验证模式,表示你不希望对用户进行验证,或是采用自定义的身份验证协议。 2.2 Enterprise Services身份验证 Enterprise Services身份验证通过使用底层的远程过程调用(RPC,Remote Procedure Call)传输结构来进行,而这种结构又使用了操作系统安全服务提供程序接口(SSPI,Security Service Provider Interface)。可以利用Kerberose或NTLM身份验证机制对Enterprise Services应用程序的客户端进行验证。 2.3 SQL Server身份验证 SQL Server可以通过Windows身份验证机制(Kerberose或NTLM),也可以通过其内置的身份验证方案-SQL身份验证机制进行验证。通常有两种可用的验证方案。 2.3.1 SQL Server and Windows 客户端可用通过SQL Server身份验证或Windows身份验证机制来连接SQL Server的某个实例。这种方式有时也被称为混合模式的身份验证。 2.3.2 Windows Only 客户端必须通过使用Windows身份验证机制来连接到SQL Server的一个实例。 3. 选择身份验证机制 设计分布式应用程序的身份验证是一项具有挑战性的任务。在应用程序开发的早期阶段,进行适当的身份验证设计有助于降低许多安全风险。 3.1 各种身份验证机制的比较 用户是否需要在服务器域中拥有Windows帐户是否支持委托是否需要Windows 2000客户端和服务器凭据是否明文传输(需要SSL)是否支持非IE浏览器 基本身份验证 是 是 否 是 是 简要身份验证 是 否 是 否 否 NTLM身份验证 是 否 否 否 否 Kerberos身份验证 是 是 是 否 否 证书身份验证 否 是 否 否 是 窗体身份验证 否 是 否 是 是 护照身份验证 否 是 否 否 是 3.2 选择身份验证机制需要考虑的因素 标识 只有当应用程序的用户具有的Windows帐户可以通过一个受信任的权威机构(它可以被应用程序Web服务器访问)来进行验证时,使用Windows身份验证机制才是合适的。 凭据管理 Windows身份验证的一个关键优势在于它可以使用操作系统进行凭据管理。当使用非Windows身份验证方式,例如窗体身份验证时,必须仔细考虑在何处以及如何保存用户凭据。其中最常用的方式是使用SQL Server数据库或是使用位于Active Directory中的User对象。 标识流动 是否需要实现一个模拟/委托模型,并将原始调用者的安全上下文在操作系统级进行跨层流动-例如,以便支持审核或针对每个用户的精细授权。 浏览器类型 应用程序的所有用户是否都拥有IE浏览器?或是你是否需要支持一个具有混合型浏览器的用户群? 我们选择身份验证时需要根据各种方式的特点,综合考虑以上因素。 3.3 Intranet系统的选择决策流程 参见图2。 3.4 SQL Server用户验证 对SQL Server的客户端进行验证,一般说来Windows身份验证要比SQL Server身份验证更安全,原因主要有以下几点: 前者负责管理用户的凭据信息,而且用户的凭据不会在网络上传输。可以避免在连接字符串中嵌入用户名和密码。可通过密码过期时限、最小密码长度、以及多次无效登录后请求的帐户锁定等措施改进登录安全性。这样可以见少词典攻击的威胁。 但是某些特定的应用程序方案中不允许使用Windows身份验证,例如: 数据库客户端和数据库服务器由一个防火墙分隔开,从而导致无法使用Windows身份验证。应用程序需要使用多个标识连接到一个或多个数据库。连接到的数据库不是SQL Server。在ASP.NET中没有一种安全的方式以特定的Windows用户的身份运行代码。 在以上这些方案中,将必须使用SQL身份验证,或是数据库的本机身份验证机制。 4. ASP.NET身份验证实现 4.1 方案特性在这部分,仅提供了一种Intranet下交互式WEB应用程序的身份验证的实现,本方案假设具有以下特性: 只有通过了身份验证的客户端才能访问应用程序。数据库相信应用程序对用户进行了相应的身份验证-即应用程序代表用户对数据库进行调用。 WEB应用程序通过使用ASP.NET进程帐户连接到数据库。用户的凭据信息是根据SQL Server数据库进行验证的。使用窗体身份验证模式。 在WEB应用程序中,用户的凭据信息是根据SQL Server数据库,采用窗体身份验证模式,便于实现用户个性化设计。采用应用程序代表用户对数据库进行调用的方式,可采用受信任子系统模型,更好地利用数据库连接池,并且可以保证用户不能直接访问后端数据库,另外可以减少后端的ACL管理工作。 4.2 安全配置步骤 4.2.1 IIS配置步骤 对Web服务的虚拟根目录启用匿名访问。 主要方法是使用IIS MMC管理单元,右击应用程序的虚拟目录,然后单击属性---〉目录安全性--〉匿名访问和安全控制--〉编辑。 4.2.2 ASP.NET配置步骤 1. 将ASPNET帐户(用于运行ASP.NET)的密码重新设置为一个更安全的密码。 这样允许在数据库服务器上复制一个本地帐户(具有相同的用户名和密码)。为了使用Windows身份验证连接到数据库时,能够使ASPNET帐户对来自数据库的网络身份验证要求进行响应,这是必须的。 具体方法是编辑位于%windr%\Microsoft.NET\Framework\v1.1.4322\CONFIG目录下的 Machine.config文件,将<processModel>元素上的密码属性重新配置,将其默认值<!-UserName= "machine" password="AutoGenerate" -->改为<!-UserName="machine" password="NewPassword" -->。 2. 配置ASP.NET,使用窗体身份验证。 编辑位于WEB服务的虚拟根目录下的Web.config文件,将<authentication>元素设置为: <authentication mode="Forms" > <forms name="MyAppFormAuth" loginUrl="login.aspx" protection="All" timeout="20" path="/"> </forms> </authentication> 4.2.3 配置SQL Server 1. 在SQL Server数据库上创建一个和ASP.NET进程帐户匹配的Windows帐户。 用户名和密码必须和ASP.NET应用程序帐号匹配。 2. 配置SQL Server,使其使用Windows身份验证。 3. 为自定义的ASP.NET应用程序帐户创建一个SQL Server登录,授予对SQL Server的访问权。 4. 创建一个新的数据库用户,并将登录名映射为数据库用户。 5. 创建一个用户定义的新数据库角色,并将数据库用户添加到该角色。 6. 为数据库角色确定数据库权限。 4.3 程序代码 4.3.1 身份验证事件序列 当未通过身份验证的用户试图放一个受保护的文件或资源被拒绝时,触发的事件序列如图3所示。 4.3.2 代码实现步骤 1. 建一个WEB登录窗体并验证用户提供的凭据信息 根据SQL Server数据库来验证凭据信息。 2. 从数据库里获取角色列表 3. 创建窗体身份验证票证 在票证中保存所获取的角色信息。示例代码如下: private void btnLogin_Click(object sender, System.EventArgs e) { //根据SQL Server数据库进行验证(具体实现略)。 bool isAuthenticated = IsAuthenticated( txtUserName.Text, txtPassword.Text ); if (isAuthenticated == true ) { //获取用户的角色 string roles = GetRoles( txtUserName.Text, txtPassword.Text );    // 创建身份验证票证 FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, // version txtUserName.Text, // user name DateTime.Now, // creation DateTime.Now.AddMinutes(60),// Expiration false, // Persistent roles ); // User data string encryptedTicket = FormsAuthentication.Encrypt(authTicket); // 创建Cookie HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); Response.Cookies.Add(authCookie); // 将用户重定向到最初请求页面。 Response.Redirect( FormsAuthentication.GetRedirectUrl( txtUserName.Text, false )); } } 4. 创建IPrincipal对象 可在Application_AuthenticateRequest事件中创建一个IPrincipal对象,一般使用GenericPrincipal类。 5. 将IPrincipal对象置于当前的HTTP上下文 protected void Application_AuthenticateRequest(Object sender, EventArgs e) { // 提去窗体身份验证cookie string cookieName = FormsAuthentication.FormsCookieName; HttpCookie authCookie = Context.Request.Cookies[cookieName]; if(null == authCookie) { return; } FormsAuthenticationTicket authTicket = null; try { authTicket = FormsAuthentication.Decrypt(authCookie.Value); } catch(Exception ex) { return; } if (null == authTicket) { return; } //提取角色 string[] roles = authTicket.UserData.Split(new char[]{'|'}); // 创建Identity object FormsIdentity id = new FormsIdentity( authTicket ); GenericPrincipal principal = new GenericPrincipal(id, roles); Context.User = principal; }
TOP

回复:ASP.NET Web 应用程序身份验证和授权机制(二)

楼主的东西不错
TOP