【问题标题】:Declarative security on methods in .NET 3.5 - how do I lock down a method's permissions?.NET 3.5 中方法的声明性安全性 - 如何锁定方法的权限?
【发布时间】:2011-01-26 08:21:58
【问题描述】:

我正在使用 .NET 3.5。假设我有一个访问特定文件和特定注册表项的方法。 我想添加限制该方法的声明性安全定义,使其只能访问指定的文件和注册表项,而不能访问其他任何内容。

当我尝试时:

    [RegistryPermission(SecurityAction.PermitOnly, Read = "registry key path"]
    [FileIOPermission(SecurityAction.PermitOnly, Read = "file path")]

...它让我可以读取文件路径,但不能读取注册表项 - 我遇到了安全异常。

如果我使用:

    [RegistryPermission(SecurityAction.Demand, Read = "registry key path"]
    [FileIOPermission(SecurityAction.Demand, Read = "file path")]

...它可以让我读取文件和注册表项,还可以让我访问其他文件。

我是否遗漏了一些关于如何使用这些方法来实现这种效果的内容?

编辑:

我用来访问注册表项的代码是:

    RegistryKey rk = Registry.LocalMachine;
    rk = rk.OpenSubKey("MyKey");
    string registryVal = rk.GetValue("Test").ToString();

因此权限声明是:

[RegistryPermission(SecurityAction.PermitOnly, Read = @"HKEY_LOCAL_MACHINE\MyKey")]

谢谢。

【问题讨论】:

  • 如果您的应用程序/AppDomain 在完全信任的情况下运行,这些属性将不起作用。您是否在部分信任下运行?
  • 好吧,如果我在使用 PermitOnly 时尝试访问属性中未列出的文件,它肯定会失败。

标签: .net security permissions declarative-security


【解决方案1】:

我认为SecurityAction.Demand 所做的就是在您当前的调用链还没有指定的访问权限时抛出一个安全异常。它不会更改您拥有的访问权限(因此它不会限制您可以写入哪些其他文件),但如果您无权访问指定的路径,您应该会看到一个安全异常。

从您指定的内容来看,PermitOnly 将是使用的正确值(它限制仅访问您指定的项目),所以我想知道您的注册表项代码是否是问题所在。一个典型的例子是 .NET 注册表类可用于以“只读”或“读写”方式打开密钥 - 如果您尝试以读写方式打开,即使您永远不要试图改变价值。

您可以将代码发布到您的注册表访问权限吗?

【讨论】:

  • 编辑了我的问题以包括注册表访问代码,谢谢:)
  • 崩溃在哪一行? OpenSubKeyGetValue?
  • OpenSubKey。嗯,也许它还需要 Registry.LocalMachine 的显式权限
  • 就是这样。我还必须添加 [RegistryPermission(SecurityAction.PermitOnly, Read = @"HKEY_LOCAL_MACHINE")]。感谢您的帮助。
猜你喜欢
  • 2014-06-08
  • 1970-01-01
  • 2011-12-15
  • 2015-12-07
  • 1970-01-01
  • 1970-01-01
  • 2016-09-20
  • 2011-10-04
  • 1970-01-01
相关资源
最近更新 更多