【问题标题】:PrincipalPermission attribute on Service contract服务合同的 PrincipalPermission 属性
【发布时间】:2015-11-20 03:12:34
【问题描述】:

是否有技术原因导致无法将 PrincipalPermission 放置在服务合同接口上?它只适用于实现契约的类或直接适用于类方法。

这不起作用。

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

但如果我将属性放在实现 IMyService 的类中的匹配方法上,它会起作用。

【问题讨论】:

  • 我只花了 2 个小时调试这个...我一生都无法理解我的 PrincipalPermissionAttribute 设置被忽略...我什至不知道该问什么,是吗我的 Ninject DI 容器,是不是因为我是自托管的,是因为我使用的是自定义 MembershipProvider/RoleProvider,是不是在应用程序配置中连接错误?感谢您为我提出正确的问题。

标签: .net wcf


【解决方案1】:

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

【讨论】:

  • 我想我要问的是,是否有技术原因不应该在服务合同上声明 PrincipalPermission 或者是框架中的疏忽?我可以编写自己的授权属性,但由于 PP 在接口上不起作用,我想知道这样做是否有充分的理由。
  • 原因是.NET中接口方法的属性与实现这些接口的类中相应方法的属性之间没有技术关系。我不知道该怎么说。
  • 哦,好吧,必须自己使用一个自定义 IOperationInvoker 来检查 Thread.CurrentPrincipal 的角色。我的自定义调用程序是使用接口上的 IOperationBehavior 和 Attribute 附加的。
【解决方案2】:

我知道这篇文章已经过时,试图为 OP 问题提供具体答案,原因在于接口和类之间的区别。

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

Or as Microsoft says it:

接口定义了一组成员的签名 实施者必须提供。接口不能提供实现 成员的详细信息 ~ (行为)

继承接口的类提供了这些方法和事件的行为。 ——也就是说实现了接口的【行为~功能】

那么为什么是界面:

如果您需要提供值类型的多态层次结构,请定义一个接口。

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

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

希望这有助于其他人理解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-31
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多