0

我在 IIS 7 内的 asp.mvc 应用程序中运行了一些代码。该代码应该将文件保存到 UNC 共享。这个函数是从一些控制器代码调用的,文件路径名 = "\MYSRV\sites\docs\10080003\egg.txt'

public void EnsureDocument(string filePathName ,string content,WindowsIdentity identity )
{
  System.Security.Principal.WindowsImpersonationContext impersonationContext = null;
  try
  {
    impersonationContext = ((System.Security.Principal.WindowsIdentity)identity).Impersonate();
    File.WriteAllText(filePathName, content);
  }
  finally
  {
    impersonationContext.Undo();
  }
}

来自 asp.net mvc 控制器的调用看起来像这样......

  // pass running identity
documentSvc.EnsureDocument(filePathname, content, WindowsIdentity.GetCurrent());
//documentSvc.EnsureCaseDocument(filePathname,content,System.Security.Principal.WindowsIdentity)User.Identity);

来自 NUnit 测试的调用看起来像这样......

documentSvc.EnsureDocument(filePathname, content, WindowsIdentity.GetCurrent() ); 

症状是 NUnit 代码删除了文件,但是来自 asp.net mvc 的调用没有删除文件。

**测试 1:通过,删除文件 ** Nunit 代码通过身份 { AuthType=Keberos, ImpersonationLevel=none , Name="DOMAIN\Fred Blogs" } 发送,这会将文件放在 unc 上。

**测试 2:失败,不删除文件 ** 在 web.config 中使用 impersonate="true" 并进行调用

documentSvc.EnsureDocument(filePathname, content, WindowsIdentity.GetCurrent());

asp.net mvc 代码通过 { AuthType=Keberos, ImpersonationLevel=Delegation, Name="DOMAIN\Fred Blogs" } 发送,并且文件不会被删除。

** 测试 3:失败,不删除文件 ** 在 web.config 中没有 impersonate="true" 并调用和拨打电话

documentSvc.EnsureCaseDocument(filePathname,content,System.Security.Principal.WindowsIdentity)User.Identity);

asp.net mvc 代码通过 { AuthType=Negotiate, ImpersonationLevel=Delegation, Name="DOMAIN\Fred Blogs" } 发送,并且文件不会被删除。

?

4

1 回答 1

0

NUnit的运行身份是你,而MVC的运行身份很可能是IUSR_...我认为这只是一个安全问题。

于 2010-09-16T15:41:03.417 回答