简介 在 Server 2003 之前,授权模型是以对象为中心的。 通过访问控制列表 (ACL) 提供控制,每个对象包括相关联的受信者列表(用户帐户、组帐户或登录会话),这些受信者拥有该对象的特定权限集合。 基于 ACL 的访问控制对某些类型的应用程序很适合。 包含明确定义的永久对象的资源管理器,如 NT System Registry,很适合采用 ACL。 您可以将 ACL 附属于对象,可以根据令牌中的组成员身份和 ACL 的内容制定访问决策。 在这些类型的应用程序中,几乎不需要任何业务规则逻辑,例如,一天中的时间或访问决策中有关的其他运行时变量。
业务线 Web 应用程序,如支出报表应用程序或基于 Web 的采购应用程序,存在着一个特有的授权问题。 对于这些应用程序,授权决策常常并不是决定对定义明确的永久对象的访问权限,而是验证工作流或验证一组多个不同的操作,如查询数据库和发送电子邮件。 制定访问决策不仅依据令牌组成员身份,而且还依据业务逻辑,例如,支出应用程序中提交的金额或工作流完成的验证。 不具有定义明确的永久对象的应用程序就无法存放 ACL。 使用 Windows Server 2003,这些动态访问决策现在就可以直接以授权管理器提供的动态业务规则(“BizRules”)的形式出现了。
基于对象的访问控制 传统模式是,Windows 应用程序通过在资源请求中模拟客户端,代表客户端请求对资源对象的访问权限。 也就是说,可以使用属于连接到应用程序的特定客户端的令牌,将资源的每个应用程序请求传递到资源。 根据为该资源维护的 ACL,资源管理器 (RM) 允许或拒绝针对资源的请求。
图 1. 用户访问权限 当客户端请求到达向资源(受 RM 保护)请求访问的应用程序时,RM 模拟客户端并调用 AccessCheck API。AccessCheck API 将依次查看该客户端的令牌、所需的对象访问权限以及该对象的安全描述符。AccessCheck API 向 RM 返回 “yes” 或 “no”,由 RM 确定是否允许客户端访问该对象。 对象的安全描述符属性以及客户端安全令牌已在客户端提出请求之前全部确定。 例如,管理员已经设置了对某个文件的权限, 不可能基于外部因素(如一天中的时间或请求的金额)动态地影响访问检查的结果。
此外,随着应用程序和环境的复杂性的增加,基于 ACL 的访问控制方案变得更难于管理。 例如,为了支持服务器应用程序,必须不断维护操作系统资源 ACL,以便为各种不断变化的应用程序客户端组授权应用程序请求。 应用程序开发人员和系统管理员都必须擅长将业务逻辑转换为特定访问控制,以用于所有应用程序所需的系统对象。
在授权管理器中实现基于角色的访问控制 Windows Server 2003 中引入了一个新的基于角色的访问控制接口:授权管理器。 以下是授权管理器的目标:
简化应用程序访问控制管理。
提供简化的自然开发模型。
实现灵活动态的授权决策。
使用授权管理器接口的应用程序进行内部组织,承担与所执行任务有关的各种角色,并在模拟这些角色时提出访问请求。
图 2. 授权管理器用户权限 在此系统下,根据每个应用程序的需要定义和维护逻辑角色和任务。 由于根据组织结构来表现安全模型,访问控制管理变得更简单。 此外,任务和角色定义有助于对应用程序工作流进行建模,在利用授权管理器时为开发人员提供自然的、以应用程序为中心的环境。
授权管理器还可以动态地限定在运行时授予的权限。 这样,访问控制决策就可以在授予权限时考虑运行时数据,例如,请求支出的金额或请求项的库存。 这是通过 BizRule(VBScript 或 Jscript_ routine)与某个任务的关联实现的。 如果在应用程序运行时检查访问权限,则执行 BizRule。 如果 BizRule 成功,用户将收到与该任务相关联的所请求操作的结果;如果 BizRule 失败,则不执行与该任务相关联的操作。
授权管理器应用程序组件 授权管理器应用程序建立在以下对象的基础上(或者使用这些对象):
授权区:以下内容的集合:角色定义、用户和组的角色分配、任务和操作。
任务:为完成某些对管理员有意义的工作单元所需的操作(或其他任务)的集合。
范围:具有不同的授权策略的任务或资源的集合;也就是说,一个范围内的所有任务和资源拥有相同的访问要求。
角色:用户为完成其工作所必需的一组权限。 角色应用于一组对象,对于分配了角色的用户有具体的语义。
基本组和动态组:Active Directory 用户或组或其他应用程序组的列表,具有非成员的附加列表。 基本组是静态列表。 通过对客户端的 Active Directory 帐户属性执行 LDAP 查询,在运行时确定动态组。
BizRule(或授权脚本):附属于任务对象的脚本。 一个 BizRule 脚本至多能附属于一个任务对象,它运行在对任务提出访问请求的时候。 BizRule 利用只有在运行时才可用的信息(例如一天中的时间或请求的金额)限定授权决策。
应用程序设计需要对应用程序内的角色、任务和范围进行仔细的定义。授权管理员将角色设计成应用程序支持的任务集合,并为用户和组分配相应的角色,以授予他们执行这些任务的权限。 对于需要在运行时确定权限的那些任务,将创建 BizRule,并将其与适当的任务相关联。
BizRule 元素 BizRule 是与某个任务相关联的脚本(VBScript 或 JScript)。 当用户请求对具有相关 BizRule 的任务进行访问时,将调用 Window 脚本引擎来执行脚本。 因为每个执行的 BizRule 都调用 Windows 脚本引擎,从计算的角度来看,BizRule 应该是较小的任务,例如,比较给定的参数或查询数据库。
下面的 JScript BizRule 示例说明了应用程序如何基于一天中的时间授予访问权限。在该示例中,如果一天中的时间在上午 9 点到晚上 5 点之间,则返回 true:
AzBizRuleContext.BusinessRuleResult = false;
dt = new Date();
hour = dt.getHours();
if (hour > 9 && hour < 17)
{
AzBizRuleContext.BusinessRuleResult = true;
}
为了提高频繁调用 BizRule 的性能,BizRule 的结果在客户端上下文生存期内被缓存。 因此,如果 BizRule 与时间相关(如前例所示),应用程序会将客户端上下文缓存一段较短但适宜的时间。
下面的 VBScript BizRule 用于验证提供的参数是否金额大于 25:
Dim Amount
AzBizRuleContext.BusinessRuleResult = FALSE
Amount = AzBizRuleContext.GetParameter("Age")
if Amount > 25 then AzBizRuleContext.BusinessRuleResult = TRUE
AzBizRuleContext.BusinessRuleResult = False
Dim Amount
Amount = AzBizRuleContext.GetParameter("ExpAmount")
' Do not accept approvals on Thursdays. When not Thursday, only allow
' approvals for amounts less than $500.
If ( Not ( Weekday( Now ) = 4 ) ) Then
If ( Amount < 500 ) Then AzBizRuleContext.BusinessRuleResult = True
End If
由于使用 BizRule 需要具备一些脚本编写知识,因此不适合许多管理员创建和修改。 通常,BizRule 是随应用程序开发和附带的,或者由应用程序供应商或其他开发人员以后提供。
AzBizRuleContext AzBizRuleContext 对象是应用程序和 BizRule 之间进行通信的手段。 AzBizRuleContext 对象是自动创建的,并且可供所有 BizRule 脚本使用。 它具有两个属性: BusinessRuleResult 和 BusinessRuleString。 BusinessRuleResult 用于指示 BizRule 是否允许用户执行请求的任务。 如果该用户被授予权限,则脚本返回 true,如果拒绝该用户访问,则返回 false。
在任何 BizRule 脚本中,第一个步骤应该是,如果未知错误所需的行为是拒绝访问,立即将 BusinessRuleResult 值设置为 FALSE。
AzBizRuleContext.BusinessRuleResult = False
否则,如果 BizRule 由于代码错误或环境问题过早退出,随机数据就有可能导致 BusinessRuleResult 的取值为 TRUE,从而授予访问权限。
BusinessRuleString 属性用于为 BizRule 设置或检索应用程序特有的字符串,其格式和内容是由应用程序定义的。 此属性的一个用途是,解释 BizRule 拒绝用户访问的理由。
AzBizRuleContext 有一个名为 GetParameter 的方法,该方法用于检索从应用程序传递到 BizRule 的任意参数的值。 该方法接受一个参数,即 BizRule 参数的名称,值就是从该参数检索的。
Amount = AzBizRuleContext.GetParameter("ExpAmount")
Service = AzBizRuleContext.GetParameter("YearsOfService")
1.0 版的授权管理器只支持 VBScript 和 Jscript。 这类脚本不能使用托管对象。 BizRule 在应用于任务之前,应该进行适当的测试。 应用程序开发人员常常很难确定和诊断脚本运行时错误的原因。
将 BizRule 添加到您的应用程序 按照下面的步骤,可将 BizRule 结合到应用程序中:
在应用程序开发时,使用 AzMan MMC 管理单元创建 BizRule。
在运行时,应用程序初始化授权管
【责编:admin】
--------------------next---------------------