2009-10-20 74 views
1

在C#中使用控制檯應用程序調用lists.asmx得到'http請求未經授權使用clien tauthentication scheme'ntlm'。從服務器收到的驗證頭是'Negotiate,NTLM'。調用lists.asmx得到'http請求未經客戶認證方案'ntlm'

環境:

  • 中Kerberos QA開啓&生產,而不是在開發(愚蠢的我知道,但我不管理任何的箱子)
  • 擊中一個SharePoint Web服務爲GET來自共享點列表(lists.asmx)的數據。
  • 服務器使用ssl。

我在QA環境中得到一個錯誤信息如下(不能粘貼堆棧跟蹤,因爲它僅是在一個畫面):

System.ServiceModel.Security.MessageSecurityException: The HTTP request is unauthorized with client authentication scheme 'Ntlm'. The authentication header received from the server was 'Negotiate,NTLM'. ---> System.Net.WebException: The remote server returned an error: (401) Unauthorized. 

直接導航到列表中工作正常,從每一個機器。

  • 代碼在開發環境(在服務器上)沒有kerberos啓用(應該是,但不是,我不能改變這個)。
  • 代碼針對啓用Kerberos的桌面計算機的生產工作
  • 代碼在啓用Kerberos的QA環境中不起作用。這是我的錯誤

要叫我做這個(沒有其他安全相關的代碼參與)的WebService

XmlElement element = this.LIstsServiceClient.GetListItems(listName, '', query, fields, '300', null, null); 

我的app.config如下

<configuration> 
    <system.serviceModel> 
     <behaviors> 
     <endpointBehaviors> 
      <behavior name="clientEndpointBehavior"> 
      <clientCredentials> 
       <windows allowedImpersonationLevel="Delegation"/> 
      </clientCredentials> 
      </behavior> 
     </endpointBehaviors> 
     </behaviors> 
     <bindings> 
      <basicHttpBinding> 
       <binding name="ListsSoap" closeTimeout="00:01:00" openTimeout="00:01:00" 
        receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" 
        bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
        maxBufferSize="999999999" maxBufferPoolSize="524288" maxReceivedMessageSize="999999999" 
        messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
        useDefaultWebProxy="true"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
         maxBytesPerRead="999999" maxNameTableCharCount="16384" /> 
        <security mode="Transport"> 
         <transport clientCredentialType="Ntlm" proxyCredentialType="Ntlm" realm="" /> 
         <message clientCredentialType="UserName" algorithmSuite="Default" /> 
        </security> 
       </binding> 
</basicHttpBinding> 
<client> 
     <endpoint address="https://servername/sitecollectionname/_vti_bin/Lists.asmx" 
       binding="basicHttpBinding" bindingConfiguration="ListsSoap" 
       contract="ListsService.ListsSoap" name="ListsSoap" behaviorConfiguration="clientEndpointBehavior" > 
      <identity> 
       <servicePrincipalName value="spn" /> 
      </identity> 
      </endpoint> 
</client> 
    </system.serviceModel> 
</configuration> 

回答

2

看一看here

啓用匿名訪問(用戶名和域用戶的密碼) 啓用集成Windows身份驗證

或者,如lextm-MSFT說,檢查要傳遞一組有效的用戶憑證

+0

無法啓用匿名訪問並嘗試執行集成Windows身份驗證。我正在嘗試使用上面粘貼的指示重新進行測量。 乾杯 – 2009-10-21 08:55:06

0

這僅僅是一個認證失敗。檢查您的控制檯應用程序是否將有效的用戶憑據發送給託管此Web服務的IIS。

+0

lextm嗨, 感謝您的建議。我確實知道這是一個驗證錯誤,但我不知道如何解決它(我無法訪問正在進行測試的盒子,因爲它與現場測試公司一樣)。 客戶端應用程序日誌中沒有錯誤,但我會要求服務器端錯誤。用戶確實可以直接訪問該頁面,所以很清楚,我無法弄清楚如何進行正確的身份驗證。 – 2009-10-21 08:54:23

0

我從來沒有設法找到答案,但主要是因爲我沒有訪問一致配置的環境,因此我無法調試我的代碼。我認爲這個問題是一個配置問題,可能與Kerberos有關。

1

我解決了問題:

把這個配置

<system.serviceModel> 
    <bindings /> 
    <client /> 
</system.serviceModel> 
0

我解決了這個允許在客戶終端,其列出的服務似乎需要爲它接收到的第一個請求的模擬(可能取決於在你打電話的網絡方法上)。列表服務會令人困惑地在內部執行身份驗證和驗證,如果失敗,會生成401或500個響應,這使得您的請求在訪問服務之前在IIS中失敗,實際上,服務方法正在執行並返回錯誤。

<behaviors> 
    <endpointBehaviors> 
     <behavior name="SPServiceBehavior"> 
      <clientCredentials> 
       <windows allowedImpersonationLevel="Impersonation" allowNtlm="True"/> 
      </clientCredentials> 
     </behavior> 
    </endpointBehaviors> 
</behaviors> 

See my question here for all the details.

相關問題