2012-11-22 34 views
4

为什么PrincipalPermission不能放置在服务合同界面上有技术原因吗?它只适用于执行合同的类或直接使用类方法。服务合同上的PrincipalPermission属性

这不起作用。

[ServiceContract] 
public interface IMyService 
{ 
    [PrincipalPermission(SecurityAction.Demand, Role="Admin")] 
    [OperationContract] 
    void MyFunction(string str); 
} 

但是,如果将属性放在实现IMyService的类中的匹配方法上,它就可以工作。

+0

我只花了2个小时来调试这个...不能为我的生活理解我的我的'PrincipalPermissionAttribute'设置被忽略...我甚至不知道该问什么,是我的Ninject DI容器,这是我自己托管的事实,是因为我使用自定义'MembershipProvider' /'RoleProvider',它是否在应用程序配置中错误连接?感谢您为我提出正确的问题。 – Lucas

回答

3

该角色在运行时使用放置在实现方法上的属性而不是放置在该方法实现的接口上的属性进行检查。在.NET中更一般地说,放置在方法上的自定义属性与放置在相应接口方法上的自定义属性之间没有直接关系(如果有的话)。

+0

我想我问的是,是否有技术上的原因,为什么PrincipalPermission不应该在服务合同上声明或者是框架中的监督?我可以写我自己的授权属性,但由于PP不能在接口上工作,我想知道是否有一个很好的理由。 –

+0

原因是没有技术上的关系。NET之间的接口方法的属性和实现这些接口的类中的相应方法上的属性之间的关系。我不知道如何说不同。 –

+2

哦,不得不自己用自定义的IOperationInvoker来检查Thread.CurrentPrincipal的角色。我的自定义调用者使用IOperationBehavior和接口上的属性进行了附加。 –

1

我知道这篇文章是旧的,试图提供一个OP的问题的具体答案,原因在于界面和类之间的差异。

想一想; 接口是对实现的描述,它不是实现的行为。 接口只是描述类的方法和事件等。

Or as Microsoft says it:

接口定义签名的一组成员 实施者必须提供的。接口无法为成员提供实施 详细信息(行为)

继承接口的类提供了这些方法和事件的行为。 - 也就是实现了接口

的[行为〜功能]那么,为什么接口:

做,如果你需要提供一个值类型的多态层次定义一个接口。

考虑定义接口来获得类似于多重继承的效果。

https://msdn.microsoft.com/library/ms229013(v=vs.100).aspx

希望这可以帮助其他人了解。