2012-11-22 74 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

希望這可以幫助其他人瞭解。