2014-04-03 128 views
7

我试图拉一些我创建的SharePoint 2013列表数据,在我的机器上本地运行时以及在本地运行一台服务器时工作正常。在用户本地和本地服务器上运行时,我都拥有相同的凭据。问题是当我发布并导航到服务器上的ASP.NET应用程序时,我得到“远程服务器返回错误:(401)未经授权。”错误...远程服务器返回错误:(401)未经授权。在ASP.NET中使用CSOMA

我看了一堆计算器上的帖子和其他一些物品网页

此指出的背景似乎是使用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

任何意见将不胜感激!

谢谢

+0

您是否知道如何从LOB获取所有实体而不应用过滤器? http://sharepoint.stackexchange.com/questions/97155/sharepoint-2013-bcs-external-data-column – monkeyjumps

回答

4

我推测您的ASP.NET网站正在使用Windows集成(NTLM)身份验证。以此方式进行身份验证的用户无法从服务器端(Web服务器)向第二个位置进行身份验证。您正在体验所谓的NTLM“双跳”(1)限制。您必须在服务器端使用专用帐户,或者如果确实要使用登录用户的身份,则必须使用允许委派的身份验证方案,例如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

+0

好吧,终于得到了回应。我已经安装了kerberos,但现在变得“目标主体名称不正确”错误。我试图四处搜索,看看这与我正在使用的技术有何关系,但未成功......任何想法? – Hidan

3

设置的crendentials通过代码:

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

你应该把这个在配置文件来改变它没有发布或重新编译应用程序。

+0

我不能硬编码的凭据,我需要使用Windows身份验证。用户将拥有一个SharePoint帐户设置。 – Hidan

+0

然后,您应该获得记录的用户凭据并将其传递到NetWorkCredential – Fals

+0

@fals使用挑战 - 响应身份验证方案(例如Windows集成(NTLM) – x0n

4

使用默认凭据为我工作:

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

只需多加一个,我遇到的设置。如果帐户仅限于访问某些服务器,而不是将客户端计算机添加到该帐户。例如,如果某个Web应用程序托管在服务器A上,并尝试使用帐户ABC连接到服务器B上的SharePoint 2010,请确保该帐户可以访问Active Directory中的服务器A.通常情况下,AD帐户没有连接到机器的限制,但在我的情况下,帐户仅限于某些机器。我将我的Web应用程序托管服务器添加到该帐户,并且它工作。

相关问题