24

我在 Intranet 上有一个 MVC Web 应用程序,并且希望能够在我们的 FTP 服务器上创建文件以发送给外部合作伙伴。

模拟代码使用 WindowsImpersonationContext。

System.Security.Principal.WindowsImpersonationContext impersonationContext;
impersonationContext = ((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate();

StreamWriter sw = System.IO.File.CreateText("PathOnFTPServer");
sw.Write("data");

impersonationContext.Undo();

这是正在发生的事情以及我提出问题的原因:

模拟前

User.Identity.Name:[我的 Windows 凭据]

System.Security.Principal.WindowsIdentity.GetCurrent().Name: NT AUTHORITY\NETWORK SERVICE

冒名顶替

User.Identity:[我的 Windows 凭据]

GetCurrent.Name:[我的 Windows 凭据]

模拟撤消

User.Identity:[我的 Windows 凭据]

GetCurrent.Name:NT AUTHORITY\NETWORK SERVICE

因此,在我模拟之前,当前用户是系统帐户,但在模拟之后,它使用的是我的 Windows 域帐户,该帐户有权在 FTP 服务器上创建文本文件。该代码使用 Visual Studio Web 服务器在本地工作,但当我将其部署在我们的测试服务器上的 IIS 上时却不能。

我收到拒绝访问错误。当模拟正确的用户时,错误的原因是什么?

4

1 回答 1

27

模拟允许机器对机器进行模拟,因此客户端浏览器和服务器在模拟时位于同一页面上。然后,当您尝试访问网络共享时,计算机不信任模拟凭据。

您需要在 Active Directory 中为 IIS 机器启用委派。转到 Active Directory 用户和计算机,找到计算机,单击属性,然后单击“信任计算机以进行委派”。(您可能需要重新启动 IIS 才能使其正常工作,我不记得了)。

还有比这更多的理论我不完全理解,但这应该有效。对不对别人可以评论!

此外,它在您的开发机器上运行的原因是开发服务器作为开发人员运行,而不是(本地)\网络服务。


一个不错的链接:

http://msdn.microsoft.com/en-us/library/cc949004.aspx

模拟和委托有什么区别?

模拟将原始调用者的身份流向同一台计算机上的后端资源。委派将原始调用者的身份流向运行服务的计算机以外的计算机上的后端资源。

例如,如果服务在 IIS 中运行而无需模拟,则该服务将使用 IIS 5.0 中的 ASP.NET 帐户或 IIS 6.0 中的网络服务帐户访问资源。通过模拟,如果客户端使用原始调用者的帐户进行连接,则服务将使用原始调用者的帐户而不是系统 ASP.NET 帐户访问同一台计算机上的 SQL Server 数据库等资源。委派与此类似,只是 SQL Server 数据库可能位于服务远程的另一台计算机上。

于 2009-09-10T14:37:02.373 回答