我知道 CAS的价值有限,但我还是想了解一下。
我不明白我看到的行为:基本默认 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();
}
}
}
我构建了这个并将 exeCASNotWorkingExample.exe
放在另一台机器(IP 为 192.168.1.101)上的文件共享“不受信任”上。然后我使用 非管理命令提示符运行它\\192.168.1.101\untrusted\CASNotWorkingExample.exe
,期望它返回“拒绝”。它不是; 它返回“授予”。
Windows 知道它正在处理一个安全性有问题的远程 EXE。当我从开始菜单运行...对话框运行相同的命令时,我收到通常的安全警告“无法验证发布者。你确定等等等等”。因此,不会以某种方式错误地认为 exe 正在本地计算机上运行并错误分配了区域。
此外,当我使用 .NET 2.0 配置工具查看相同的 exe 时(右键单击“运行时安全策略”,选择“评估程序集...”),我看到 .NET 仅将 Internet_Zone 权限分配给程序集. 这些权限不包括 FileIOPermission(独立存储是它自己的权限)。
替代文字 http://img5.imageshack.us/img5/2256/casperms.jpg
可能对其他人有用但到目前为止还没有对我有用的数据:
- 我在阅读MCTS 70-536 考试的MS Press 书籍时遇到了这个问题。第 11 章是关于 CAS 的;第 1 课 / 示例 1 对我来说失败了,就像上面描述的那样。你在这里看到的是一个精简的变体。
- 我已经验证了像这样的 EXE 实际上可以写入磁盘,即 IsGranted 检查可能是正确的。
- 两台机器运行 Vista SP1 和 WinXP。无论哪个是客户端,哪个是文件服务器,行为都是相同的,所以这不是 Vista 的事情。
- 当作为标准非特权用户和作为管理员运行时,行为是相同的。
- 不在 AD 域中运行。
- 客户端和文件服务器上的用户名和密码相同,因此我可以访问文件而无需使用
net use
提供凭据。
我敢肯定这将是那些“arrrgh”时刻之一......我错过了什么?