我开发了一个ASP.NET MVC 3,它必须访问SharePoint远程文件夹。
为此,在开发期间,在运行Visual Studio开发服务器之前,我尝试访问远程文件夹。然后,我必须介绍有权查看远程资源的用户的凭据。在此之后,使用以下代码:
string path = @"\\tests.sharepoint.es\folder1";
DirectoryInfo di = new DirectoryInfo(path);
DirectoryInfo[] dis = di.GetDirectories();
成功访问该文件夹。但是,当我从IIS执行我的Web应用程序时,这会失败,导致下一个错误:
拒绝访问路径'\ tests.sharepoint.es \ folder1 \'。
即使我为应用程序池设置了运行Visual Studio开发服务器的同一用户,它也会继续失败。
我已经确定运行万维网发布服务(W3SVC)的用户是SYSTEM(显然无权访问该文件夹的帐户)但我无法更改此内容并且我不确定如果这导致问题。
另外,我已经阅读了一些关于使用 SPSecurity.RunWithElevatedPrivileges 的帖子,但我无法使用它,因为我的IIS服务器没有安装Sharepoint(它在另一台机器上),因此,我据我所知,不能使用Microsoft.Sharepoint.dll。
更新:当我尝试使用Windows资源管理器访问资源时,我已经读过操作系统使用WebDav而不是NetBios。 IIS可以使用此协议访问资源吗?
答案 0 :(得分:0)
如果您确实需要从Windows Web服务器(或模拟远程客户端的任何其他服务器)使用Windows权限访问远程资源,则必须在服务器框上直接登录帐户下运行此类代码。这是由“NTLM一跳”策略引起的 - 用户的凭据只能用于直接登录的机器用户或机器用户直接与之通信(而不是第二台机器尝试连接的第三个)。
最安全的方法是在帐户下运行可以访问远程资源并在该流程中运行代码的流程。您可以在此类帐户下运行IIS进程,但如果在请求期间运行代码,则可能需要将模拟还原为进程。
您也可以直接冒充特定用户,但您需要拥有纯文本登录信息。这很可能违反了大多数公司的安全政策。
注意:您最终可能会建立匿名代理 - 请务必小心了解与实际用户帐户不同的帐户访问远程资源的含义。
答案 1 :(得分:0)
幸运的是,我已经找到了解决访问问题的方法。
我使用了此post中描述的解决方案。
我的代码看起来像这样:
PinvokeWindowsNetworking.connectToRemote(@"\\tests.sharepoint.es\folder1", "domain\user", "password");
//manage files and folders of my remote resource
//...
PinvokeWindowsNetworking.disconnectRemote(@"\\tests.sharepoint.es\folder1");