2014-04-03 66 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應用程序託管服務器添加到該帳戶,並且它工作。

相關問題