为什么此代码访问安全示例已损坏?

时间:2009-05-30 00:37:02

标签: .net code-access-security

我知道CAS是of limited value,但无论如何我想要了解它。

我不明白我所看到的行为:在我相当正常的环境中,基本的默认CAS似乎根本不起作用。

参加此示例课程:

using System;
using System.Security;
using System.Security.Permissions;

namespace CASNotWorkingExample
{
    class Program
    {
        static void Main(string[] args)
        {
            FileIOPermission perm = new FileIOPermission(PermissionState.Unrestricted);

            if (SecurityManager.IsGranted(perm))
                Console.WriteLine("granted");
            else
                Console.WriteLine("denied");

            Console.ReadKey();
        }
    }

}

我构建了这个并将exe CASNotWorkingExample.exe放到文件共享“untrusted”上的另一台机器(IP是192.168.1.101)上。然后我使用\\192.168.1.101\untrusted\CASNotWorkingExample.exe从非管理命令提示符运行它,期望它返回“被拒绝”。它不是;它返回“已授予”。

Windows知道它正在处理一个有问题的安全性的远程EXE。当我从开始菜单运行...对话框中运行相同的命令时,我得到通常的安全警告“发布者无法验证。你确定等等”。因此,它不会错误地认为exe在本地计算机上运行并错误分配区域。

此外,当我使用.NET 2.0配置工具查看相同的exe时(右键单击“运行时安全策略”,选择“评估程序集...”),我看到.NET只分配了Internet_Zone权限到集会。这些权限不包括FileIOPermission(独立存储是它自己的权限)。

alt text http://img5.imageshack.us/img5/2256/casperms.jpg

可能对其他人有用但迄今为止没有找到我的数据:

  • 我在通过MS Press book进行MCTS 70-536考试时遇到了这个问题。第11章是关于CAS的;第1课/示例1对我来说失败了,几乎如上所述。你在这里看到的是一个精简的变体。
  • 我已经验证过像这样的EXE实际上可以写入磁盘,即IsGranted检查可能是正确的。
  • 这两台机器正在运行Vista SP1和WinXP。行为是相同的,无论客户端是哪个,文件服务器是哪个,所以它不是Vista的东西。
  • 作为标准非特权用户和管理员运行时,行为相同。
  • 未在AD域中运行。
  • 客户端和文件服务器上的用户名和密码相同,因此我可以访问该文件,而无需使用net use来提供凭据。

我确信这将成为那些“arrrgh”时刻之一...我错过了什么?

2 个答案:

答案 0 :(得分:1)

我不是CAS大师,但我怀疑这可能是由于change in .NET 3.5 SP1允许来自网络共享的代码作为完全信任运行。

编辑:Brad Abrams states不需要重新编译/目标来利用这一点。我认为它反向运行相同 - 如果您的计算机上有3.5 SP1,那么定位2.0将无法让您获得旧的行为。

  

不必以任何方式重新编译或更改现有应用程序以利用此功能。您当前的2.0应用程序将正常工作,您无需在3.5 ..

中定位任何新内容

我认为仅使用2.0 FX的全新(VM)安装可能能够将其作为原因。

答案 1 :(得分:0)

更改的工作方式是在启动托管exe时有一个新的证据。当从win32 CreateProcess API直接启动exe时,托管exe将获得完全信任。

当然,.net配置工具不会启动exe,只是检查它。这意味着证据不同并影响分配给它的代码组。这反过来会影响权限。

相当混乱。

可在此处找到更多信息:

msdn social

Brad Abrams blog