在ASP.NET MVC模拟
我有一个内部网上的MVC Web应用程序,并希望能够在我们的FTP服务器上创build文件发送给外部合作伙伴。
模拟代码使用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服务器上创build文本文件。 该代码在本地使用Visual Studio Web服务器工作,但不在我们的testing服务器上的IIS上部署时。
我得到一个访问被拒绝的错误。 当正确的用户被冒充的时候,错误的原因是什么?
模拟允许机器模拟机器,因此客户端浏览器和服务器在模拟时位于同一页面上。 当您尝试访问networking共享时,计算机不信任模拟的凭据。
您需要为Active Directory中的IIS计算机启用委派。 转到“Active Directory用户和计算机”,find计算机,单击属性,然后select“信任计算机以进行委派”。 (您可能需要重新启动IIS才能正常工作,我不记得)。
还有更多的理论,比我不完全理解,但这应该工作。 无论是否对其他人可以评论!
另外,它在您的开发机器上工作的原因是开发服务器作为开发人员运行,而不是(本地)\networking服务。
体面的链接:
http://msdn.microsoft.com/en-us/library/cc949004.aspx
模拟和授权有什么区别?
模拟将原始呼叫者的身份stream动到同一台计算机上的后端资源。 委派将原始呼叫者的身份stream动到运行该服务的计算机以外的计算机上的后端资源。
例如,如果服务在没有模拟的情况下在IIS内运行,则该服务将使用IIS 5.0中的ASP.NET帐户或IIS 6.0中的networking服务帐户访问资源。 通过模拟,如果客户端使用原始调用者的帐户进行连接,则服务将使用原始调用者的帐户而不是系统ASP.NET帐户访问同一台计算机上的资源(如SQL Server数据库)。 委派类似,只不过SQL Server数据库可能位于远程服务的不同机器上。