0

我想在一個偏僻的SharePoint站點(不同SP Web應用程序)來讀取從列表中值。 Web應用程序使用聲明身份驗證進行設置,客戶端Web應用程序SP託管帳戶使用SPN進行配置。我相信Kerberos和聲明是正確設置的,但我無法訪問遠程服務器,並且請求導致一個異常:「遠程服務器返回錯誤:(401)未經授權。」的SharePoint 2010客戶端對象模型 - 的Kerberos /宣稱驗證

ctx.ExecuteQuery();發生異常,但它不捕獲if (scope.HasException)中的異常,而是調用代碼捕獲異常(使用{}塊之外)。

當我看在交通使用Wireshark的遠程服務器上,它看起來並不像請求甚至讓服務器;這幾乎就像在Kerberos票據交換索賠之前發生了401一樣。

這裏是我的代碼:

using (ClientContext ctx = new ClientContext(contextUrl)) 
{ 

    CredentialCache cc = new CredentialCache(); 
    cc.Add(new Uri(contextUrl), "Kerberos", CredentialCache.DefaultNetworkCredentials); 
    ctx.Credentials = cc; 
    ctx.AuthenticationMode = ClientAuthenticationMode.Default; 

    ExceptionHandlingScope scope = new ExceptionHandlingScope(ctx); 
    Web ctxWeb = ctx.Web; 
    List ctxList; 
    Microsoft.SharePoint.Client.ListItemCollection listItems; 

    using (scope.StartScope()) 
    { 
     using (scope.StartTry()) 
     { 

      ctxList = ctxWeb.Lists.GetByTitle("Reusable Content"); 
      CamlQuery qry = new CamlQuery(); 
      qry.ViewXml = string.Format(ViewQueryByField, "Title", "Text", SharedContentTitle); 
      listItems = ctxList.GetItems(qry); 
      ctx.Load(listItems, items => items.Include(
           item => item["Title"], 
           item => item["ReusableHtml"], 
           item => item["ReusableText"])); 
     } 
     using (scope.StartCatch()) { } 
     using (scope.StartFinally()) { } 
    } 
    ctx.ExecuteQuery(); 

    if (scope.HasException) 
    { 
     result = string.Format("Error retrieving content<!-- Error Message: {0} | {1} -->", scope.ErrorMessage, contextUrl); 
    } 


    if (listItems.Count == 1) 
    { 
     Microsoft.SharePoint.Client.ListItem contentItem = listItems[0]; 

     if (SelectedType == SharedContentType.Html) 
     { 
      result = contentItem["ReusableHtml"].ToString(); 
     } 
     else if (SelectedType == SharedContentType.Text) 
     { 
      result = contentItem["ReusableText"].ToString(); 
     } 
    } 


} 

我實現與CredentialCache部分不應該要求必要的,但每一個例子,我能找到的是無論是在一個控制檯應用程序運行,或在客戶端某種應用;此代碼在常規ASP.NET UserControl的代碼隱藏中運行。

編輯:我應該提到,當遠程URL是與調用代碼相同的Web應用程序的根網站集時,上述代碼甚至不起作用(它位於/ sites/) - 換句話說,即使主機名與調用代碼相同。

什麼就嘗試下任何建議都非常感謝!

Mike

回答

0

有沒有理由不使用標準OM?

你已經說了,這是一個網絡的一部分,這意味着它是在應用程序池帳戶的上下文中運行。除非您通過切換用戶來提升權限,否則將無法正確進行身份驗證。也許嘗試一下。但是,如果您已經可以訪問API,則不會使用客戶端OM。

+0

我需要能夠進行跨Web應用程序的調用,並在服務器場......我想我可以放棄交叉農場功能,但我更願意把它。它實際上是在用戶控件運行,不是一個Web部件,但我想就它而言,這裏幾乎沒什麼不同 - 它們都運行在SPContext中。我想這是值得嘗試服務器端API的跨Web應用程序調用,因爲我使用Kerberos。今天早上我會試一試。 – 2012-03-16 14:48:08

+0

那麼,爲了跟進,我無法在該環境中使用客戶端OM進行跨農場調用。我仍然不知道,如果它是一個環境問題或隱晦的東西錯了,我做的方式,所以,直到我可以成立一個獨立的環境,自己從頭開始,我在十字架上的農場的東西放棄,去回到使用標準的服務器端OM。 – 2012-03-24 16:20:32

相關問題