到目前为止,我么介绍的授权策略都是围绕着安全主体进行的,基本上都是基于角色的授权。虽然角色是定义权限最为常用的形式,但是它解决不了授权的所有问题。基于角色的授权策略一般是这样的:需要进行访问控制的操作或者资源关联到某个角色上,那么只要访问者被分配了该角色,就被授予了相应的权限。那么假设我们的授权策略是这样的:访问权限和两个角色进行关联,访问者需要同时被分配了这两个角色才能被授权。这是一个很常见的授权策略,但是典型的基于单一角色的授权解决不了这个问题(除非为两个角色的交集创建新的角色)。而这仅仅是一种简单的授权策略,有时候授权需要通过一个复杂的表达式来表示,而且其中会涉及诸多元素,比如身份、角色和组织等。

我之所以说这么多,主要是为说明一个问题:授权策略有时候需要手工定制。而作为一种基于可扩展性的通信框架,WCF在授权方面提供了扩展点,使你可以根据的你实际需要定制相应的授权策略。WCF为了创建了一个基于“声明”的授权系统,为了让读者对该系统的内部原理有全面的了解,我们不妨先来讨论一下这里指的声明是如何定义的。

目录:
一、Claim和ClaimSet
二、DispatchRuntime中的AuthorizationPolicy和ServiceAuthorizationManager
三、通过自定义AuthorizationPolicy创建基于自定义授权策略的声明
四、通过自定义ServiceAuthorizationManager根据声明作出最后的授权判断

一、Claim和ClaimSet

声明描述了与系统中某个实体关联的功能,该实体通常为该系统中的某个用户。通过对访问给定的受保护资源所需的声明和与试图进行访问的实体关联的声明进行比较,便可确定该资源的访问权限。声明是针对特定值的权限表达式。权限可以是读取、写入或拥有。值可以是数据库、文件、邮箱或属性。声明还具有声明类型。声明类型和权限的组合提供了用于针对该值指定的功能的机制。在WCF安全应用编程接口中,生命通过类型Claim表示。从下面给出的关于Claim定义的代码片断中,我们可以认识到:一个通过Claim对象表示的声明具有如下三要素:声明类型(ClaimType)声明关联的资源(Resource)声明代表的权限类型(Right)

class Claim
   2: {
//其他成员
string ClaimType { get; }
object Resource { get; }
string Right { get; }
   7: }

相关文章: