任何人都可以向我解释如何
<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而不从头开始和冒充做什么?
答案 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。