客户端对象模型在模拟登录用户时给出401-MVC应用程序
-
09-12-2019 - |
题
我有一个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中禁用匿名身份验证。
我们尝试过的事情:
- 确保应用程序池帐户能够委派权限。
- 经过验证的kerberos配置(我们删除了一些重复的Spn)
- 从不同的服务器连接(我们在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