考虑在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
操作只需要用户权限。
这可能吗?如果是这样,怎么样?
答案 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
实例以包装和替换自定义的实例。