1

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

  <identity impersonate="true" /> 

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

\我的服务器\

用户可以导航到

\myServer\someFolder\

然后

\myServer\someFolder\sharedFolderOnAnotherServer\

然后

\myServer\someFolder\sharedFolderOnAnotherServer\anotherFolder\

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

\myServer\someFolder\sharedFolderOnAnotherServer\

并尝试移动到一个孩子,我得到这个错误:

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

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

4

1 回答 1

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 的某种其他形式的身份验证。

于 2012-12-06T15:49:37.503 回答