在ASP.Net中使用模拟

时间:2012-12-06 15:44:51

标签: asp.net vb.net

任何人都可以向我解释如何

  <identity impersonate="true" /> 

的作品?我创建了一个Web应用程序,其中包含一个允许用户查看服务器上的文件夹的对话框。它的工作原理是使用更新面板并刷新对话框树视图。本质上,它的作用是获取父节点(具有服务器文件夹的路径)并使用DirectoryInfo获取其所有子节点。然后,当用户点击某个孩子时,它会被所有孩子刷新。但是,继承人的问题。如果我有这样的道路:

\ myServer上\

用户可以导航到

\ myServer上\ someFolder \

然后

\ myServer上\ someFolder \ sharedFolderOnAnotherServer \

然后

\ myServer上\ someFolder \ sharedFolderOnAnotherServer \ anotherFolder \

一切都很好。但是,如果我从

开始

\ myServer上\ someFolder \ sharedFolderOnAnotherServer \

试着搬到一个孩子身边,我得到了这个错误:

“使用的帐户是一个计算机帐户。使用您的全局用户帐户或本地用户帐户访问此服务器。”

如路径所示,文件夹“sharedFolderOnAnotherServer”实际上是另一台服务器上共享文件夹的快捷方式。如果我从根目录开始然后按照我的方式进入最终文件夹,就好像我从第一台服务器的权限被转移到第二台服务器,一切都很好。但是,如果我跳过第一台服务器,然后直接转到第二台服务器,我就不会继承我的权限。如果我在我的web.config文件中使用impersonate标记,它可以正常工作,但会导致获取当前登录用户和使用活动目录的其他问题。任何人都可以解释为什么我不能直接跳转到:\ myServer \ someFolder \ sharedFolderOnAnotherServer \ anotherFolder \ path而不从头开始和冒充做什么?

1 个答案:

答案 0 :(得分:1)

如果没有模拟,Web服务器将使用其运行的应用程序池的标识来访问资源。使用模拟时,Web服务器使用经过身份验证的用户的身份(即最终用户)访问资源。换句话说,您的Web服务器进程会“模拟”您的最终用户。

Impersonate = true会导致Web服务器模拟整个请求的最终用户。如果您需要更精细的控制,另一个选择是在您的代码中使用模拟:

//Request uses application pool identity out here.
WindowsIdentity identity = (WindowsIdentity)HttpContext.Current.User.Identity;
if(identity != null)
{
    using(identity.Impersonate())
    {
        //Request uses end user identity to access resources here
    }
    //back to using application pool resources.
}

这假设您使用Windows身份验证或其他形式的身份验证将HttpContext.Current.User设置为WindowsPrincipal。