一尘不染

在ASP.NET MVC中模拟

c#

我在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服务

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

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


阅读 337

收藏
2020-05-19

共1个答案

一尘不染

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

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

除了我不完全理解的理论之外,还有很多其他方法,但这应该行得通。是否正确,其他人可以发表评论!

另外,它在您的开发计算机上运行的原因是开发服务器以开发人员身份运行,而不是(Local)\ Network Service。


体面的链接:

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

模拟和委派有什么区别?

模拟将原始呼叫者的身份传递到同一台计算机上的后端资源。委派将原始呼叫者的身份流到运行该服务的计算机以外的计算机上的后端资源。

例如,如果服务在IIS中运行而没有模拟,则该服务将使用IIS 5.0中的ASP.NET帐户或IIS
6.0中的网络服务帐户访问资源。通过模拟,如果客户端使用原始调用方的帐户进行连接,则该服务将使用原始调用方的帐户(而不是系统ASP.NET帐户)访问同一台计算机上的资源,例如SQL
Server数据库。委托与之类似,只是SQL Server数据库可以位于服务之外的另一台计算机上。

2020-05-19