来电者的许可与申报人的许可

时间:2015-06-26 04:36:18

标签: c# permissions delegates

我正在阅读 MSDN 上的代表,并看到了一行

注意:  代理在调用者的安全权限下运行,而不是声明者的权限“

这是什么意思?

1 个答案:

答案 0 :(得分:2)

假设问题是关于Windows权限,而不是.Net Code Access Security(CAS)。

无论在创建委托时运行的帐户代码是什么(即框管理员),Windows权限将在实际调用时计算 - 这可能与创建时的不同。

想象一下,您运行的代码可以执行帐户模拟(Windows用户)以访问某些文件:

// run under "account1" - has access to c:\myFile.txt
// current Environment.UserName = "account2"
Func<string,string> readAllFile = fileName => File.ReadAllText(fileName);

// start impersonation of account2 - has access to c:\otherFile.txt, 
// but not c:\myFile.txt
ImpersonateAccount("account2", readAllFile);
....

...ImpersonateAccout(string name, Func<string,string> readAllFile)
{
  // .... impersonation code omitted
  // current Environment.UserName = "account2"
  var text1 = readAllFile(@"c:\otherFile.txt"); // success
  var text2 = readAllFile(@"c:\myFile.txt"); // failure
  ....

在代码在readAllFile下运行时创建的上述示例account1,但它没有“捕获”该帐户的权限,因此后来的委托无法读取c:\myFile.txt哪个“account2” “没有权限。

请注意,委托“捕获”C#级别上下文,如局部变量,这可能会带来其他类型的上下文也被捕获的假设。 Window安全上下文以及.Net执行上下文(例如当前线程的文化)不是这种情况。