2012-09-04 63 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

是的,这对我的问题来说确实是一个很好的解决方案,对我来说它很有用。谢谢你,你帮了我很多。 –