WCF授权 - 通过声明访问操作

时间:2009-07-18 14:15:24

标签: wcf authentication authorization

我正在尝试为WCF服务实现授权,但我遇到了一些重大困难。我想我需要使用结合自定义身份验证和声明的混合解决方案,但我不确定这是否正确。

我的应用程序使用Windows身份验证连接到应用程序。一旦用户获得授权,就需要根据存储在数据库中的权限信息授予对功能的访问权。

可以通过应用程序界面为用户分配权限。权限层次结构的一个级别对应于对单个WCF函数的访问:

  • 访问模块(纯粹组织)
    • 访问功能(访问WCF功能,自动检查)
      • 特定于功能的权限(在代码中动态检查)

样本结构和用法:

  • 优惠
    • 可以创建货件
      • 可以覆盖命名约定
    • 可以打包发货
      • 必须由主管核实
      • 可以生成海关文件 ...

class ShippingService : IShippingService
{
    // Access corresponds to "Can create shipment" permission
    public bool CreateShipment(string name)
    {
        ...

        // Check the function-specific permission dynamically.
        if (!ConformsToNamingConvention(name) && !CheckPermission(Permissions.CanOverrideNamingConvention))
            return false;
        ....
        return true;
    }
}

我认为我需要做的是通过实施IAuthorizationPolicy来创建自定义授权策略。这将连接到数据库,为用户提取权限并为每个权限添加声明。然后,我将需要创建一个自定义授权管理器,将所请求的操作与声明列表进行比较,以确定连接用户是否已获得授权。

这是接近这个的正确方法,还是我:

a)过度复杂化问题,或

b)错误地使用WCF组件(例如声明,IAuthorizationPolicy,AuthorizationManager ......)

提前感谢您的帮助和最好的问候。

1 个答案:

答案 0 :(得分:2)

这种方法与几乎所有其他方法一样,您希望允许业务用户动态创建和删除角色。你怎么在代码中检查它?通常,您将方法或服务调用的执行限制为特定角色(或一组角色) - 如果您希望在运行时动态创建角色,这将如何工作?

如果您可以使用预定义的角色,那么可以使用一些解决方案。你看过ASP.NET role provider了吗?它是更一般的ASP.NET成员资格和角色提供程序集的一部分,但它也可以单独使用。

要激活它,请在配置中使用此代码段(一旦为ASP.NET角色提供程序设置基本基础结构):

<behaviors>
 <serviceBehaviors>
  <behavior name="CalculatorServiceBehavior">
   <serviceAuthorization principalPermissionMode ="UseAspNetRoles"
                         roleProviderName ="SqlRoleProvider" />
  </behavior>
 </serviceBehaviors>
</behaviors>

我唯一的另一个想法是查看授权管理器(AzMan):这是一组工具,允许您指定相当精细的“原子”权限,然后业务用户可以组成角色并将用户分配给那些用户。但基本上,最后,在粒度程序函数的底层(AzMan中的“任务”),你再次处理一组静态权利。

请查看此MSDN article on AzMan作为简介,并参阅此article in the WCF security guidance,了解如何在WCF服务中使用它。我不知道AzMan目前的状态,我不知道它是否会进一步发展 - 它几乎看起来有点像它不会(但我不是100%肯定)。

马克