首页 文章

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

提问于
浏览
0

我知道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 从非管理命令提示符运行它,期望它返回"denied" . 它不是;它返回"granted" .

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

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

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

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

  • 我在参加MCTS 70-536考试的MS Press book时遇到了这个问题 . 第11章是关于CAS的;第1课/示例1对我来说失败了,几乎如上所述 . 你在这里看到的是一个精简的变体 .

  • 我已经验证过像这样的EXE实际上可以写入磁盘,即IsGranted检查可能是正确的 .

  • 这两台机器正在运行Vista SP1和WinXP . 无论哪个是客户端,哪个是文件服务器,行为都是一样的,所以它不是Vista的东西 .

  • 作为标准非特权用户和管理员运行时,行为相同 .

  • 未在AD域中运行 .

  • 客户端和文件服务器上的用户名和密码相同,因此我可以访问该文件而无需使用 net use 来提供凭据 .

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

2 回答

  • 1

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

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

    很混乱 .

    更多信息可以在这里找到:

    msdn social

    Brad Abrams blog

  • 0

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

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

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

    我认为只有2.0 FX的新安装(VM)可能能够将其作为原因 .

相关问题