-->

.NET声明安全:为什么SecurityAction.Deny不可能一起工作呢?(.NET Decl

2019-09-17 20:22发布

我一直在搞乱这个了约一天半的时间,现在通过.NET反射和MSDN文档筛选,并不能弄清楚什么了...

由于它矗立在.NET框架中,你可以要求,目前主要属于一个角色可以通过标记这样的方法来执行的方法:

[PrincipalPermission(SecurityAction.Demand, Role = "CanEdit")]
public void Save() { ... }

我有一个已经定义的“只读”角色的现有安全模型的工作,所以我需要做的正是上述相反......如果用户是在“只读”的作用阻止Save()方法。 没问题吧? 只是翻转SecurityAction到.Deny:

[PrincipalPermission(SecurityAction.Deny, Role = "ReadOnly")]
public void Save() { ... }

那么,事实证明,这确实什么都没有。 该方法仍运行正常。 似乎下的PrincipalPermissionAttribute定义:

public override IPermission CreatePermission()

但是,当属性被设置为SecurityAction.Deny,这种方法不会被调用,所以有史以来没有IPermission对象。 有谁知道的一种方式来获得.Deny工作? 我一直试图做一个定制secutiry属性,但即使不工作。 我试图变得棘手,做:

public class MyPermissionAttribute : CodeAccessSecurityAttribute
{
    private SecurityAction securityAction;

    public MyPermissionAttribute(SecurityAction action)
        : base(SecurityAction.Demand)
    {
        if (action != SecurityAction.Demand && action != SecurityAction.Deny)
            throw new ArgumentException("Unsupported SecurityAction. Only Demand and Deny are supported.");
        this.securityAction = action;
    }

    public override IPermission CreatePermission()
    {
        // do something based on the SecurityAction...
    }
}

请注意我的属性构造总是通过SecurityAction.Demand,这是一个行动,将以前的工作。 然而,即使在这种情况下,当属性被设置为.Demand,而不是.Deny的CreatePermission()方法仍然只能叫! 也许运行时实际检查属性,而不是传递给CodeAccessSecurityAttribute构造的SecurityAction?

我不知道还有什么可以尝试在这里......人有什么想法? 你不会觉得这将是很难根据角色拒绝访问的方法,而不是只要求很高吧。 这真的打扰我,默认从的PrincipalPermission的IDE中看起来像它会就好做了.Deny,并没有像在暗示,它不会工作MSDN文档1班轮。 你可能会认为下的PrincipalPermissionAttribute构造函数将抛出一个异常,如果紧接该.Demand指定以外的任何其他,因为这可能造成很大的安全漏洞! 我永远都不会意识到.Deny做什么都没有,如果我没有单元测试!

同样,这一切都源于不必处理有需要被拒绝访问是“只读”的角色现有的安全模型,而不是周围做它的其他方式,在这里我只是中央社访问权限授予一个角色。

谢谢你的帮助!


快速后续:

实际上,我可以通过这样做使我的自定义属性的工作:

public class MyPermissionAttribute : CodeAccessSecurityAttribute
{
    public SecurityAction SecurityAction { get; set; }

    public MyPermissionAttribute(SecurityAction action)
        : base(action)
    {
    }

    public override IPermission CreatePermission()
    {
        switch(this.SecurityAction) { ... } // check Demand or Deny
    }
}

装潢方法:

[MyPermission(SecurityAction.Demand, SecurityAction = SecurityAction.Deny, Role = "ReadOnly")]
public void Save() { ... }

但是,这是非常丑陋的,因为我指定需求和在同一个属性拒绝。 但它确实工作...

另一个有趣的现象:我的自定义类扩展CodeAccessSecurityAttribute,这反过来仅延SecurityAttribute。 如果我cnage我的自定义类直接扩展SecurityAttribute,然后什么都没有的作品。 因此,似乎在运行时肯定希望在元数据仅CodeAccessSecurityAttribute情况,并做一些有趣的与指定的SecurityAction,即使一个自定义的构造函数覆盖它。

文章来源: .NET Declarative Security: Why is SecurityAction.Deny impossible to work with?