使用自定义属性创建角色检查器

时间:2011-03-30 07:52:13

标签: c# wcf

考虑在ServiceContract的每个操作中输入以下代码行:

if (!Roles.IsUserInRole("Administrators")) 
    throw new Exception("You are not authorized to perform this operation");

将来我想添加的不仅仅是这个,我可能想在某处记录失败的呼叫。这意味着我必须改变我所拥有的每个操作中的行为。

我想要做的是在我的OperationContracts上创建一个自定义属性:RequireMinimumRoleAttribute,如下所示:[RequireMinimumRole("Administrators"]

首先,我希望它的行为类似于MVC中的过滤器上下文,我想在调用实际操作之前检查角色 。这可能吗?

其次,我希望在ServiceContract上添加另一个属性:FallbackRequireMinimumRoleAttribute,如果某个操作未指定RequireMinimumRoleAttribute,则会使用该属性。

示例

服务合同

[ServiceContract]
public class ICalculator
{
    [OperationContract]
    public int Add(int a, int b);

    [OperationContract]
    public string Information();
}

实施

[FallbackRequireMinimumRole("Users")]
public class Calculator : ICalculator
{
    [RequireMinimumRole("Administrators")]
    public int Add(int a, int b) { return a + b; }

    public string Information() { return "This is a calculator service"; }
}

在这种情况下,Add需要管理员权限,而Information操作只需要用户权限。

这可能吗?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:1)

我不确定您的身份验证\授权提供程序,但如果可以解决您的问题,请查看PrincipalPermissionAttribute。点击How to: Restrict Access with the PrincipalPermissionAttribute Class

答案 1 :(得分:1)

这是一种可能的方式:

实施自定义IOperationInvoker,将现有Invoker打包在DispatchOperation中。它应该在链接到原始调用者之前简单地进行授权检查以发送操作。它需要一个ctor,它需要IOperationInvoker(被包裹的那个),以及要检查的角色名称。

在构建WCF调度程序运行时时安装自定义调用程序的适当实例:在IOperationBehavior上实现RequireMinimumRoleAttribute,在IServiceBehavior上实现FallbackRequireMinimumRoleAttribute。在每种情况下,ApplyDispatchBehavior的实现应该导航DispatcherRuntime对象以找到适当的Invoker实例以包装和替换自定义的实例。