.NET Security属性.是否可以创建自定义安全模型



常见问题:如何在any中实现用户访问权限区分系统。NET应用程序(例如WCF应用程序)?

因此,我们有:

  1. 一组用户
  2. 一组角色(例如,枚举Role
  3. 每个用户都有自己的角色集
  4. 可以为特定角色指定每个类/方法。

    [授权属性(角色=新角色[]{Role.Admin})]公共类UserService:IUserService{

    }

  5. 如果用户的角色集不包含此角色,则用户必须无权访问该方法。

更新。我试着把问题描述得更清楚一些。阿克顿的解决方案对这个问题很好。

可以像您建议的那样创建一个属性安全模型,但这并不容易。您的安全对象必须从ContextBoundObject继承,安全属性必须从ContextAttribute继承(或实现IContextAttribute接口)。然后:

  1. 实现IContextAttribute。GetPropertiesForNewContext(IConstructionCallMessage)方法。创建一个对象,称之为MySecurityProperty,实现IContextPropertyIContributeObjectSink接口,并将其添加到IConstructionCallMessage.ContextProperties集合中
  2. 在MySecurityProperty的实现中。GetObjectSink(MarshalByRefObject,IMessageSink)构造一个对象,称之为MySecurityAspect,用于实现IMessageSinck接口
  3. 在MySecurityAspect的实现中。SyncProcessMessage(IMessage),您实际上会检查调用是否有效。如果它强制转换为IMethodMessage,指示方法调用,则可以查询IMethodMessage的属性,以查看它是否在调用具有安全属性的方法或类,并进行适当的检查。如果调用未经授权,则抛出适当类型的异常

你需要几个小时才能让它发挥作用,但一旦发挥作用,它就有意义了。它只是的一个非常缺乏支持的部分。Net框架。除了复杂性之外,最大的问题是它迫使您的安全类从ContextBoundObject继承,而不是从任何其他库类继承。ContextBoundObject还继承自MarshalByRef,后者可能会干扰序列化。

请参阅http://www.developerfusion.com/article/5307/aspect-oriented-programming-using-net/3/以获得更深入的解释。

最新更新