2012-09-04 102 views
0

常見問題:如何使用類/方法屬性在任何.NET應用程序(例如,WCF應用程序)中實現用戶訪問權限區分系統?.NET安全屬性。是否有可能制定自定義安全模型?

因此,我們有:

  1. 一組用戶
  2. 的一組角色(例如,枚舉Role
  3. 每個用戶都擁有自己的一套自己的角色。
  4. 可以爲特定角色指定每個類/方法。

    [AuthorizationAttribute(角色=新角色[] {} Role.Admin) 公共類UserService:IUserService {

    }

  5. 如果用戶的角色集不包含這個角色,用戶不能訪問該方法。

更新。我試圖讓問題描述更清楚。阿克頓的解決方案適用於這個問題。

+0

我真的找不到任何理由來解決這個問題 - 阿克頓有一個很好的答案。 所以,這裏不難告訴我們要問什麼。 –

回答

3

可以像您建議的那樣創建屬性安全模型,但這並不容易。您的安全對象必須從ContextBoundObject繼承,您的安全屬性從ContextAttribute(或實現IContextAttribute接口)。然後:

  1. 執行IContextAttribute.GetPropertiesForNewContext(IConstructionCallMessage)方法。您創建一個對象,稱爲MySecurityProperty,該對象實現了IContextPropertyIContributeObjectSink接口並將其添加到IConstructionCallMessage.ContextProperties集合。
  2. 在執行MySecurityProperty.GetObjectSink(MarshalByRefObject, IMessageSink)構造一個對象時,將其稱爲MySecurityAspect,它實現了IMessageSink接口。
  3. 在執行MySecurityAspect.SyncProcessMessage(IMessage)時,您確實檢查了呼叫以查看它是否有效。如果它轉換爲IMethodMessage,指示方法調用,則可以查詢IMethodMessage的屬性以查看它是否使用您的安全屬性調用方法或類並執行相應的檢查。如果該調用未經授權,請拋出適當類型的異常。

它需要幾個小時才能完成工作,但一旦完成,它就很有意義。它只是.Net框架中一個非常不受支持的部分。除了複雜性之外,最大的問題是它迫使你的安全類從ContextBoundObject繼承,而不是任何其他庫類繼承。 ContextBoundObject也繼承自MarshalByRef,這可能會干擾序列化。

請參閱http://www.developerfusion.com/article/5307/aspect-oriented-programming-using-net/3/以獲得更深入的解釋。

+0

是的,這對我的問題來說確實是一個很好的解決方案,對我來說它很有用。謝謝你,你幫了我很多。 –