2011-03-30 83 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