.NET安全属性。是否可以制作自定义安全模型?

时间:2012-09-04 12:46:49

标签: .net security authentication custom-attributes

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

所以,我们有:

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

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

    }

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

  6. 更新。我试图让问题描述更加清晰。阿克顿的解决方案很适合这个问题。

1 个答案:

答案 0 :(得分:3)

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

  1. 实施IContextAttribute方法。您创建一个对象,称之为MySecurityProperty,实现IContextPropertyIContributeObjectSink接口,并将其添加到IConstructionCallMessage.ContextProperties集合。
  2. IContextAttribute.GetPropertiesForNewContext(IConstructionCallMessage)构造对象的实现中,将其称为MySecurityAspect,实现IMessageSink接口。
  3. MySecurityProperty.GetObjectSink(MarshalByRefObject, IMessageSink)的实现中,您实际上会检查调用是否有效。如果它转换为MySecurityAspect.SyncProcessMessage(IMessage),表示方法调用,则可以查询IMethodMessage的属性,以查看它是否正在使用您的安全属性调用方法或类并执行相应的检查。如果呼叫未经授权,则抛出相应类型的异常。
  4. 它需要几个小时才能让它工作,但是,一旦它完成,它是有道理的。它只是.Net框架中一个非常不受支持的部分。除了复杂性之外,最大的问题是它会强制您的安全类继承ContextBoundObject而不是任何其他库类。 ContextBoundObject也继承自IMethodMessage,这可能会干扰序列化。

    有关更深入的解释,请参阅MarshalByRef