我有一个ASP.NET 通过客户端OM连接到SharePoint2010的MVC应用程序。当我跑 ExecuteQuery(), ,我从SharePoint收到HTTP401错误。

我有MVC应用程序设置为模拟登录用户。

Web中的模拟设置。配置(MVC应用程序):

<configuration>
    <system.web>
        <identity impersonate="true" />
    </system.web>
</configuration>

守则:

Client Context ctx = new ClientContext("http://sharepoint.company.com/site");
ctx.Credentials = CredentialCache.DefaultNetworkCredentials;

Web web = ctx.Web;
ListCollection lists = web.Lists;

ctx.Load(web);
ctx.Load(lists);

ctx.ExecuteQuery();

例外情况:

System.Net.WebException:远程服务器返回错误:(401)未经授权。在System.Net.HttpWebRequest.GetResponse() 在微软。SharePoint。客户。SPWebRequestExecutor。执行() 在微软。SharePoint。客户。ClientContext。保证格式() 在微软。SharePoint。客户。ClientContext。执行任务() 在MVCApp。服务。SharePointService。图书馆()

当我从web中删除模拟设置时。然后,客户端OM使用MVC应用程序的应用程序池帐户进行连接。发生这种情况时,连接成功(在授予应用程序池帐户权限后)。另外,如果我硬编码用户凭据,而不是使用 DefaultNetworkCredentials, ,连接工作为好。

该应用程序已配置为Windows身份验证,并且在IIS中禁用匿名身份验证。

我们尝试过的事情:

  1. 确保应用程序池帐户能够委派权限。
  2. 经过验证的kerberos配置(我们删除了一些重复的Spn)
  3. 从不同的服务器连接(我们在SharePoint应用程序服务器上托管此应用程序)。从该服务器连接意味着我们无法连接到任何sharepoint实例。从另一个服务器连接允许我们连接到我们的开发环境,但不是这个服务器(QA)或我们的生产环境。

我可以做些什么来让客户端OM在连接到SharePoint时委派用户权限?


更新资料

有趣的是,我尝试了一个简单的WebRequest到SharePoint,结果相同,它告诉我问题不是由客户端引起的。:

WebRequest request = WebRequest.Create("http://xxxxxxxxx");
request.Credentials = CredentialCache.DefaultNetworkCredentials;

using(WebResponse response = request.GetResponse())
using(StreamReader reader = new StreamReader(response.GetResponseStream()))
{
    return Content(reader.ReadToEnd(), "text/html");
}
有帮助吗?

解决方案

这听起来很像你在打臭名昭着的 NTLM双跳问题 而且我很抱歉地说,除了将您的身份验证更改为声明或Kerberos之外,没有任何方法可以绕过它。这两者都不应该掉以轻心。

如果您的代码在您尝试与之交互的SharePoint场中的一台计算机上运行,那么您可能可以通过完全跳过第二个"跳转"并直接通过服务器上的对象模型而不是通过web服务与SharePoint交互来解决此问题。

其他提示

几乎两年过去了,但最近我遇到了与SharePoint2013相同的问题(我实际上已经使用SP2010CSOM库访问了SP2013)。最后我设法解决了问题。

首先,我假设Kerberos身份验证在您的情况下正常运行。为了安全起见,您可以在IIS设置中关闭NTML身份验证或在测试页面上显示

Thread.CurrentPrincipal.Identity.AuthenticationType

应该是 谈判;谈判.当您实际使用NTML登录时,尝试委派是没有意义的,这可能发生在您都允许的情况下。

接下来,更新您的问题。它帮助了我很多,我已经意识到,当使用WebRequest的最简单委派不起作用时,我们不应该担心CSOM。问题就在这里。

最后,这个不起眼的链接从 S J answer实际上可以提供解决方案–您提到了配置委派的所有步骤,除了允许委派 服务器.是的,您必须配置您信任 两者兼而有之 用于委派的帐户(您提到)和用于委派的此特定机器。

还有一件非常明显的事情–SharePoint本身需要正确配置Kerberos身份验证。

一旦web请求的委派工作(例如加载起始页),你可以用CSOM做同样的事情。我已经测试过了,就像一个魅力。

不同之处在于,我已经(1)将SP2013与2010CSOM一起使用,(2)仅针对特定片段而不是整个请求启用委派:

string ImpersonatedSpLogin = null, ImpersonatedSpMail = null;

WindowsIdentity identity = (WindowsIdentity)User.Identity;
using (var impersonationContext = identity.Impersonate())
{
    using (ClientContext context = new ClientContext("http://myServer.somewhere.com/"))
    {
        context.Load(context.Web.CurrentUser);
        context.ExecuteQuery();
        ImpersonatedSpLogin = context.Web.CurrentUser.LoginName;
        ImpersonatedSpMail = context.Web.CurrentUser.Email;
    }

    impersonationContext.Undo();
}
// now you can verify by checking  ImpersonatedSpLogin and ImpersonatedSpMail

希望这对任何人都有帮助。

你有没有 <authentication mode="Windows" /> 在那里的某个地方?我相信这也是必需的。

下面的链接有一些关于基于web配置设置的一些变量输出的信息。配置和IIS

https://stackoverflow.com/a/1688220/1282079

许可以下: CC-BY-SA归因
scroll top