远程服务器返回错误:(401)未经授权。在ASP.NET中使用CSOM。

9
我试图拉取我创建的一些SharePoint 2013列表数据,当在我的机器上本地运行时和在服务器上本地运行时都正常工作。我使用相同的凭据在本地和服务器上运行。问题是当我发布并导航到我的ASP.NET应用程序时,我会遇到"The remote server returned an error: (401) Unauthorized." 的错误...
我看了很多stackoverflow上的帖子和其他网站的文章。
这表明上下文似乎正在使用IUSR: http://blogs.msdn.com/b/sridhara/archive/2014/02/06/sharepoint-2013-csom-call-from-web-part-fails-with-401-for-all-users.aspx 这篇文章建议尝试设置默认网络凭据: https://sharepoint.stackexchange.com/questions/10364/http-401-unauthorized-using-the-managed-client-object-model 我尝试了在文章中提到的修复方法以及尝试强制上下文使用DefaultNetworkCredentials,但没有成功。我希望应用程序使用已登录用户的凭据而不是计算机的凭据...
以下是我使用的代码:
        SP.ClientContext context = new SP.ClientContext("MySPDevInstance");
        context.Credentials = CredentialCache.DefaultNetworkCredentials;

        Entity entity = context.Web.GetEntity(collectionNamespace, collectionName);
        LobSystem lobSystem = entity.GetLobSystem();
        LobSystemInstanceCollection lobSystemInstanceCollection = lobSystem.GetLobSystemInstances();

        context.Load(lobSystemInstanceCollection);
        context.ExecuteQuery();

        LobSystemInstance lobSystemInstance = lobSystemInstanceCollection[0];
        FilterCollection filterCollection = entity.GetFilters(filter);

        filterCollection.SetFilterValue("LimitFilter", 0, 1000);

        EntityInstanceCollection items = entity.FindFiltered(filterCollection, filter, lobSystemInstance);

服务器正在运行 IIS 6.0。

欢迎提供任何建议!

谢谢!


你知道如何在不应用筛选器的情况下获取LOB中的所有实体吗?http://sharepoint.stackexchange.com/questions/97155/sharepoint-2013-bcs-external-data-column - monkeyjumps
4个回答

6
我猜想你的ASP.NET网站正在使用Windows集成(NTLM)身份验证。以这种方式认证的用户不能从服务器端(Web服务器)进行第二次身份验证。您正在经历NTLM的“双跳”限制。您必须在服务器端使用专用帐户,或者如果您确实想要使用已登录用户的身份,则必须使用允许委派的身份验证方案,例如Kerberos。
如果您确实需要用户的身份来访问SharePoint数据,并且无法更改身份验证方案,则最好的方法是使用JavaScript CSOM。这意味着用户直接向SharePoint服务器进行身份验证(单跳,而不是双跳),并且您的ASP.NET站点为用户提供包含此脚本的页面。
(1)http://blogs.msdn.com/b/knowledgecast/archive/2007/01/31/the-double-hop-problem.aspx

1
谢谢您的回复!如果我设置了Kerberos并且SharePoint服务器和Web服务器彼此信任,那么上面的代码应该可以工作吗? - Hidan
1
是的,@Hidan,那就是想法。 - x0n
1
忘了提到,当我本地运行时,现在出现“远程服务器返回错误:(401) 未经授权。”如先前所述,这在设置kerberos之前是有效的。 - Hidan
1
我在代码中将NTLM添加到凭据缓存中并将其传递给SharePoint上下文,尝试强制使用NTLM。在本地计算机上返回数据,但在服务器上则出现“拒绝访问。您没有执行此操作或访问此资源的权限。”错误...所以我想,如果我尝试将NTLM类型更改为kerberos会怎样,但不幸的是,在我的本地计算机和服务器上都出现了“远程服务器返回错误:(401)未经授权。”。 - Hidan
是的...不幸的是,Kerberos需要基础设施人员的合作来设置SPN并在AD中配置计算机以启用委派(如果需要)。 - x0n
显示剩余2条评论

4

使用默认凭据对我有效:

HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.UseDefaultCredentials = true;

3

通过代码设置凭据:

SP.ClientContext context = new SP.ClientContext("MySPDevInstance");
context.Credentials = new NetworkCredential("username", "password");

您应该将此放在配置文件中,以便在不发布或重新编译应用程序的情况下进行更改。

我不能硬编码凭据,我需要使用Windows身份验证。用户将拥有设置好的SharePoint帐户。 - Hidan
然后,您应该获取已登录用户的凭据并将其传递给NetWorkCredential。 - Fals
@fals 当使用挑战-响应身份验证方案(如Windows集成(NTLM))时,已登录用户的凭据对他不可用。 - x0n

0

只是想要增加我遇到的另一个设置。如果帐户被限制仅访问某些服务器,则还应将客户端机器添加到该帐户中。例如,如果 Web 应用程序托管在 Server A 上,并尝试使用 ABC 帐户连接到 Server B 上的 SharePoint 2010,则请确保该帐户在 Active Directory 中具有访问 Server A 的权限。通常,AD 帐户没有限制连接到计算机,但在我的情况下,该帐户仅限于某些计算机。我将我的 Web 应用程序托管服务器添加到了该帐户中,然后它就可以正常工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接