0

常见问题:如何使用类/方法属性在任何.NET应用程序(例如WCF应用程序)中实现用户访问权限区分系统?

所以,我们有:

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

    [AuthorizationAttribute(Roles = new Role[] { Role.Admin })] 公共类 UserService : IUserService {

    }

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

更新。我试图使问题描述更清楚。Akton 的解决方案很好地解决了这个问题。

4

1 回答 1

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-orientated-programming-using-net/3/ 。

于 2012-09-04T13:35:39.743 回答