.NET 声明式安全性:为什么 SecurityAction.Deny 无法使用?

2024-05-07

我已经搞乱了大约一天半的时间,现在正在筛选 .NET Reflector 和 MSDN 文档,但无法弄清楚任何事情......

在 .NET 框架中,您可以通过标记如下方法来要求当前的委托人属于一个能够执行方法的角色:

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

我正在使用已经定义了“ReadOnly”角色的现有安全模型,因此我需要执行与上述相反的操作...如果用户处于“ReadOnly”角色,则阻止 Save() 方法。没问题吧?只需将 SecurityAction 翻转为 .Deny:

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

好吧,事实证明这根本没有任何作用。该方法仍然运行良好。似乎主体权限属性定义:

public override IPermission CreatePermission()

但是,当属性设置为 SecurityAction.Deny 时,永远不会调用此方法,因此不会创建任何 IPermission 对象。有谁知道如何让 .Deny 工作?我一直在尝试制作自定义安全属性,但即使这样也行不通。我试图变得狡猾并做:

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,这是之前可以工作的一个操作。 然而,即使在这种情况下,CreatePermission() 方法仍然仅在属性设置为 .Demand 而不是 .Deny 时调用!也许运行时实际上是在检查属性而不是传递给 CodeAccessSecurityAttribute 构造函数的 SecurityAction?

我不知道这里还能尝试什么...有人有什么想法吗?您不会认为根据角色拒绝方法访问会那么困难,而不仅仅是要求它。让我感到非常不安的是,默认的 PrimaryPermission 出现在 IDE 中,就像执行 .Deny 就可以了,而且 MSDN 文档中有一个 1-liner 暗示它不起作用。您可能会认为,如果指定了 .Demand 以外的任何内容,PrincipalPermissionAttribute 构造函数会立即抛出异常,因为这可能会造成很大的安全漏洞!如果我没有进行单元测试,我永远不会意识到 .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() { ... }

但这非常难看,因为我在同一属性中指定了 Demand 和 Deny。但它确实有效...

另一个有趣的说明:我的自定义类扩展了 CodeAccessSecurityAttribute,而 CodeAccessSecurityAttribute 又仅扩展了 SecurityAttribute。如果我使用自定义类来直接扩展 SecurityAttribute,则根本不起作用。因此,运行时似乎肯定只在元数据中查找 CodeAccessSecurityAttribute 实例,并使用指定的 SecurityAction 执行一些有趣的操作,即使自定义构造函数会覆盖它。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET 声明式安全性:为什么 SecurityAction.Deny 无法使用? 的相关文章

随机推荐

  • 如何在Python中创建一个派生自QObject的抽象基类

    我正在尝试为接口创建一个抽象基类 但我需要它从 QObject 派生信号和槽 我的类定义如下 import abc from PyQt5 QtCore import QObject class interface class abc ABC
  • 关键字和非关键字参数的顺序

    我有以下代码 def say hello then call f f args kwargs print args is args print kwargs is kwargs print Hello Now I m going to ca
  • Angular .controller() 在 .run() AngularJS 之前运行

    我在 run 中有一个 ajax 调用 该调用将一个变量加载到 rootScope 中 该变量在与视图关联的控制器中是需要的 有时 在刷新 F5 时 当 controller 加载时 rootScope SuperCategories 中没
  • 使用 Vagrant,为什么 puppet 配置比自定义打包盒更好?

    我正在创建一个虚拟机来模仿我们的生产 Web 服务器 以便我可以与新开发人员共享它 让他们尽快上手 我已经阅读过 Vagrant 文档 但是我不明白使用通用基础盒并使用 Puppet 配置所有内容与打包已安装和配置所有内容的自定义盒相比有何
  • 如何在chrome中启用sharedArrayBuffer而不进行跨域隔离

    我有一个仅在本地计算机上运行的实验 例如 我加载外部网页https example com和 puppeteer 我注入一个 javascript 文件 该文件由http localhost 5000 到目前为止还没有问题 但是 这个注入的
  • 如何解决“错误:找不到与安装匹配的版本”?

    我正在尝试使用 pipelinenv 安装 django crispy forms 它安装是因为当我运行 pip freeze 命令时我看到它 当需要锁定 包 依赖项时 它面临锁定 我收到此错误 pipenv exceptions Reso
  • 如何修复在 laravel 项目中运行vendor/bin/phpunit 时权限被拒绝的问题

    每当我执行vendor bin phpunit在我的 laravel 项目的根路径中 它返回一个没有权限错误 我该如何解决这个问题 重要提示 我不想使用composer update或删除部分或全部vendor 目录然后使用composer
  • 使用 C 库时 C++ 中的常量正确性

    目前我正在开发一个 C 应用程序 我希望它是 const 正确的 意思是尽可能在参数上使用 const 之类的东西 然而 这个 C 应用程序使用了一个不经常使用 const 的 C 库 我遇到的问题是 当向 C 库中的函数发送参数时 参数不
  • 为什么 .Net 词典中的条目是按加法顺序排列的?

    我刚刚看到这种行为 我对此感到有点惊讶 如果我向字典中添加 3 或 4 个元素 然后执行 For Each 来获取所有键 它们将以我添加的顺序出现 这让我感到惊讶的原因是字典内部应该是一个哈希表 所以我希望事情能以任何顺序出现 按键的哈希排
  • 熊猫 Between_time 布尔值

    我正在尝试创建一个列 如果行值落在时间 09 00 和 17 00 之间 该列将分配 true 我可以使用轻松选择这些时间between time但无法分配新列 aTrue False df df between time 9 00 17
  • 如何在 iPhone 上实现炫酷的警报/信息叠加?

    我了解如何在我的 iPhone 应用程序中包含标准警报 并且可以使用 确定 或 关闭 按钮将其关闭 请参阅图中的示例 如何制作一个很酷的警报 通知覆盖层 就像 foursquare 应用程序中看到的那样 请参阅图片中的 foursquare
  • 在未排序的整数列表中最优搜索 k 个最小值

    我刚刚接受采访时提出了一个问题 我很好奇答案应该是什么 问题本质上是 假设您有一个包含 n 个整数的未排序列表 您如何找到此列表中的 k 个最小值 也就是说 如果您有一个 10 11 24 12 13 列表并且正在寻找 2 个最小值 您将得
  • 访问注释中的属性值

    我想访问注释中的属性值 作为属性的值 对于前 在我的属性文件中 我有一个条目表达式 3 10 在我的 Scheduler 类中 我使用注释 Scheduled cron VALUE 我想从表达式键对应的属性文件中读取这个值 尝试这样做 Va
  • 将 h1 元素的内容复制到剪贴板?

    所以 我做了一个翻译器 但效果不是很好 但无论如何 它正在工作 我想尝试添加一些可以复制结果的内容 有没有办法做到这一点 以下是我的代码 提前致谢 我知道有一种方法可以通过输入来完成此操作 但我不确定是否可以通过标题来完成 var myTe
  • 将表单作为本地表单传递给 Rails 5 中渲染的部分 ajax

    我已经查遍了 找不到有效的解决方案 相关控制器 profits controller rb def new tabs market Market order mjsnumber all first profit Profit new pro
  • 如何使用aaply并保留数组中的维度顺序?

    我有一个 3 维数组 我想将函数应用于第三维并返回一个数组 我很高兴 plyr aaply 几乎能满足我的要求 但是它会交换我的数组的尺寸 文档告诉我它是幂等的 这 在我查找之后 让我认为结构应该保持不变 这是一个带有恒等函数的可重现示例
  • Jenkins 多分支管道 - 在分支中配置属性?

    我们已经使用 Jenkins 多分支管道插件成功设置了构建管道 该插件在大多数情况下都运行良好 但是我们遇到了一个困扰我们的问题 Jenkinsfile包含一组属性 这些属性也显示在 UI 中 但如何为各个分支设置默认值 这就是我们的属性定
  • 如何使用 Haskell 中的 thyme 库从 Int 值创建 UTCTime?

    我有年 月 日 小时和分钟值 所有这些都是类型Int 我怎样才能将它们转换为UTCTime or UniversalTime 需要导入以下内容 import Control Lens import Data Thyme Clock impo
  • 错误:(52, 0) 未找到 Gradle DSL 方法:使用 Quickblox API 中的“сompile()”

    我尝试通过添加在线 Maven 依赖项在我的程序中使用 Quickblox API 我正在使用 Android Studio 当我尝试构建我的程序时 它显示以下错误 Error 52 0 Gradle DSL method not foun
  • .NET 声明式安全性:为什么 SecurityAction.Deny 无法使用?

    我已经搞乱了大约一天半的时间 现在正在筛选 NET Reflector 和 MSDN 文档 但无法弄清楚任何事情 在 NET 框架中 您可以通过标记如下方法来要求当前的委托人属于一个能够执行方法的角色 PrincipalPermission