我在内联网上有一个 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().名称:NT AUTHORITY\NETWORK SERVICE
后冒充
用户身份:[我的 Windows 凭据]
GetCurrent.Name:[我的 Windows 凭据]
模拟撤消
用户身份:[我的 Windows 凭据]
GetCurrent.Name:NT AUTHORITY\NETWORK SERVICE
因此,在我模拟之前,当前用户是系统帐户,但在模拟之后,它使用的是我的 Windows 域帐户,该帐户有权在 FTP 服务器上创建文本文件。该代码使用 Visual Studio Web 服务器在本地运行,但当我将其部署在测试服务器上的 IIS 上时则无法运行。
我收到拒绝访问错误。当正确的用户被冒充时,错误的原因是什么?
模拟允许机器对机器的模拟,因此在模拟时客户端浏览器和服务器位于同一页面上。当您尝试访问网络共享时,计算机不信任模拟的凭据。
您需要在 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 数据库可能位于服务远程的另一台计算机上。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)