常见问题:如何在any中实现用户访问权限区分系统。NET应用程序(例如WCF应用程序)?
因此,我们有:
- 一组用户
- 一组角色(例如,枚举
Role
) - 每个用户都有自己的角色集
-
可以为特定角色指定每个类/方法。
[授权属性(角色=新角色[]{Role.Admin})]公共类UserService:IUserService{
}
-
如果用户的角色集不包含此角色,则用户必须无权访问该方法。
更新。我试着把问题描述得更清楚一些。阿克顿的解决方案对这个问题很好。
可以像您建议的那样创建一个属性安全模型,但这并不容易。您的安全对象必须从ContextBoundObject继承,安全属性必须从ContextAttribute继承(或实现IContextAttribute接口)。然后:
- 实现IContextAttribute。GetPropertiesForNewContext(IConstructionCallMessage)方法。创建一个对象,称之为
MySecurityProperty
,实现IContextProperty
和IContributeObjectSink
接口,并将其添加到IConstructionCallMessage.ContextProperties
集合中 - 在MySecurityProperty的实现中。GetObjectSink(MarshalByRefObject,IMessageSink)构造一个对象,称之为
MySecurityAspect
,用于实现IMessageSinck接口 - 在MySecurityAspect的实现中。SyncProcessMessage(IMessage),您实际上会检查调用是否有效。如果它强制转换为IMethodMessage,指示方法调用,则可以查询
IMethodMessage
的属性,以查看它是否在调用具有安全属性的方法或类,并进行适当的检查。如果调用未经授权,则抛出适当类型的异常
你需要几个小时才能让它发挥作用,但一旦发挥作用,它就有意义了。它只是的一个非常缺乏支持的部分。Net框架。除了复杂性之外,最大的问题是它迫使您的安全类从ContextBoundObject继承,而不是从任何其他库类继承。ContextBoundObject还继承自MarshalByRef,后者可能会干扰序列化。
请参阅http://www.developerfusion.com/article/5307/aspect-oriented-programming-using-net/3/以获得更深入的解释。