我在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()。名称: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上部署时则不行。
我收到拒绝访问错误。正确的用户被假冒时出现错误的原因是什么?
答案 0 :(得分:24)
模拟允许机器进行模拟,因此客户端浏览器和服务器在模拟时位于同一页面上。然后,当您尝试访问网络共享时,计算机不信任模拟的凭据。
您需要在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数据库可能位于远离服务的其他计算机上。