我在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();
这是发生了什么以及我的问题的原因:
Pre Impersonation
User.Identity.Name:[我的Windows凭据]
System.Security.Principal.WindowsIdentity.GetCurrent() . 名称:NT AUTHORITY \ NETWORK SERVICE
Post Impersonation
User.Identity:[我的Windows凭据]
GetCurrent.Name:[我的窗口凭据]
Impersonate Undo
User.Identity:[我的Windows凭据]
GetCurrent.Name:NT AUTHORITY \ NETWORK SERVICE
因此,在我冒充之前,当前用户是系统帐户,但在模仿之后,它正在使用我的Windows域帐户,该帐户有权在FTP服务器上创建文本文件 . 该代码使用visual studio Web服务器在本地工作,但在我在测试服务器上的IIS上部署时则不行 .
我收到拒绝访问错误 . 正确的用户被模拟时出现错误的原因是什么?
1 回答
模拟允许机器进行模拟,因此客户端浏览器和服务器在模拟时位于同一页面上 . 然后,当您尝试访问网络共享时,计算机不信任模拟的凭据 .
您需要在Active Directory中为IIS计算机启用委派 . 转到“Active Directory用户和计算机”,找到计算机,单击“属性”和“信任计算机以进行委派” . (您可能需要重新启动IIS才能使用此功能,我不记得了) .
有更多的理论比我不完全理解,但这应该有效 . 是否对别人可以发表评论!
此外,它在您的开发机器上工作的原因是开发服务器作为开发人员运行,而不是(本地)\网络服务 .
一个不错的链接:
http://msdn.microsoft.com/en-us/library/cc949004.aspx