2011-03-30 43 views
2

考虑下面的代码行中我的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需要管理priviligies和Information操作只需要用户特权。

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

+0

您正在使用哪种身份验证和角色配置文件机制? – 2011-03-30 09:44:33

+0

我正在使用asp.net会员。 – 2011-03-30 13:08:01

回答

1

这里是一个可能的方式:

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

到WCF调度程序运行时生成时安装自定义调用适当的实例:落实FallbackRequireMinimumRoleAttributeIOperationBehaviorRequireMinimumRoleAttributeIServiceBehavior。在每种情况下,执行ApplyDispatchBehavior都应导航DispatcherRuntime对象以找到适当的Invoker实例来包装和替换自定义实例。

1

我不确定您的身份验证授权提供程序,但如果它能解决您的问题,请查看PrincipalPermissionAttribute。请在这里How to: Restrict Access with the PrincipalPermissionAttribute Class

+0

我使用的是asp.net会员提供程序,我会看看那个。不过,我仍然想添加自定义行为并拥有自己的属性。 – 2011-03-30 08:32:46

+0

@Filip:您需要AOP后编译(如Postsharp)或动态代理(如Castle项目所做的)才能向您的属性添加行为。你为什么要记录这些信息。您已经在应用程序的顶层登录。你可以区分这些异常类型。 – Steven 2011-03-30 09:27:44