2011-02-07 187 views
11

雖然調用Web服務,我得到以下錯誤:HTTP請求是未經授權的客戶端身份驗證方案「NTLM」

The HTTP request is unauthorized with client authentication scheme 'NTLM'. The authentication header received from the server was 'NTLM'. The HTTP request is unauthorized with client authentication scheme 'NTLM'. The authentication header received from the server was 'NTLM'.

我有一個Silverlight 4的應用程序,都在我的IIS調用WCF Web服務, (7)。 我的WCF Web服務使用NTLM(Windows身份驗證)調用安裝在其他Web服務器上的另一個ASMX Web服務。 我的兩臺服務器和託管ASMX Web服務的服務器都在同一個域中。

當Silverlight客戶端使用http://localhost/MySiteName從服務器打開應用程序時,一切正常。但是,當Silverlight客戶端從不同的客戶端打開應用程序時,這不是服務器,但仍然在同一個域中,使用http://MyServerName/MySiteName然後我得到錯誤。

Windows身份驗證在我的IIS中啓用。 我的IIS中禁用匿名身份驗證。調用我的WCF Web服務

綁定配置爲:

<binding name="winAuthBasicHttpBinding"> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Windows" /> 
     </security> 
    </binding> 
用於調用ASMX web服務

綁定配置爲:

<binding name="ClNtlmBinding"> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Ntlm" /> 
     </security> 
    </binding> 
+0

綁定配置調用我的WCF的Web服務: <綁定名稱= 「winAuthBasicHttpBinding」> <安全模式= 「TransportCredentialOnly」> <傳輸clientCredentialType = 「視窗」/> 用於調用ASMX Web服務綁定的配置是:<綁定名稱=「ClNtlmBinding 「> kruvi

回答

18

OK,這裏是進入腦海的事情:

  • 您大概在IIS上運行的WCF服務必須在具有特權的安全上下文中運行t調用Web服務。您需要確保應用程序池中的用戶是域用戶 - 理想情況下是專用用戶。
  • 不能使用模擬用戶使用的安全令牌使用模擬傳遞迴ASMX因爲my WCF web service calls another ASMX web service, installed on a **different** web server
  • 再次嘗試改變NtlmWindows和測試。

OK,在模擬幾句話。 基本上它是一個已知的問題,您不能使用您獲得到一臺服務器的模擬令牌傳遞給另一臺服務器。原因似乎是令牌是一種使用用戶密碼的哈希,對於從中間服務器無法使用的機器生成有效。


UPDATE

WCF下是可能的(從一個服務器到另一個服務器,即轉發假冒)。看看這個話題here

+0

謝謝。 當我將域用戶設置爲應用程序池時,它運行良好,但現在我所有對WS的調用都是在應用程序池域用戶下執行的。 我不能使用模擬來呼叫ASMX ws,因此呼叫在客戶端的用戶安全令牌下執行? – kruvi

+0

順便說一句,我忘記提及,當與特定用戶(登錄到客戶端的同一用戶)模擬使用時,一切正常: client = new ClCustomersServiceClient(); client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; client.ClientCredentials.Windows.ClientCredential = new NetworkCredential(「username」,「password」,「domain」); response = client。ClCustomersQuery(請求); – kruvi

+0

我已更新,看看。 – Aliostad

7

問題發佈後很長一段時間,但我遇到類似情況下的相同問題。我有一個控制檯應用程序,我正在使用Web服務,我們的IIS服務器放置了Web服務,並啓用了Windows身份驗證(NTLM)。

我跟着this link,這解決了我的問題。下面是App.config示例代碼:

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="Service1Soap"> 
       <security mode="TransportCredentialOnly"> 
        <transport clientCredentialType="Ntlm" proxyCredentialType="None" 
         realm=""/> 
        <message clientCredentialType="UserName" algorithmSuite="Default"/> 
       </security> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost/servicename/service1.asmx" 
      binding="basicHttpBinding" bindingConfiguration="ListsSoap"/> 
    </client> 
</system.serviceModel> 
0

1)我必須做我的配置如下:(添加BackConnectionHostNames或禁用環回檢查) http://support.microsoft.com/kb/896861

2)我的工作掀起了開發系統一個孤立的開發網絡。我已經使用開發系統的計算機名稱在Web服務的URL中得到了它的工作,但是當我將URL修改爲將在生產中使用的URL(而不是計算機名稱)時,我開始出現NTLM錯誤。

3)我注意到安全日誌顯示該服務帳戶無法登錄,其錯誤類似於MSDN文章中的錯誤。

4)添加BackConnectionHostNames使得它可以通過運行在服務器上的瀏覽器登錄服務器,但服務帳戶在嘗試驗證Web服務時仍然存在NTLM錯誤。我結束了禁用循環回來檢查,併爲我修復它。

0

也許你可以參考一下:http://msdn.microsoft.com/en-us/library/ms731364.aspx 我的解決辦法是改變兩個屬性 authenticationScheme和proxyAuthenticationScheme爲「NTLM」,然後它的作品。

PS:我的環境是如下 - 服務器端:.NET 2.0 ASMX - 客戶端:.NET 4

1

我不得不

client.ClientCredentials.UserName.UserName = domain + "\\" + username; client.ClientCredentials.UserName.Password = password

移動域名,用戶名,密碼

client.ClientCredentials.Windows.ClientCredential.UserName = username; client.ClientCredentials.Windows.ClientCredential.Password = password; client.ClientCredentials.Windows.ClientCredential.Domain = domain;

2

對我來說,解決方案除了使用「Ntlm」作爲憑證類型,與Jeroen K的解決方案類似。如果我有權限級別,我會再加上他的職務,但是讓我在這裏發佈我的整個代碼,這將同時支持Windows和其他憑據類型,如基本身份驗證:

XxxSoapClient xxxClient = new XxxSoapClient(); 
    ApplyCredentials(userName, password, xxxClient.ClientCredentials); 

    private static void ApplyCredentials(string userName, string password, ClientCredentials clientCredentials) 
    { 
     clientCredentials.UserName.UserName = userName; 
     clientCredentials.UserName.Password = password; 
     clientCredentials.Windows.ClientCredential.UserName = userName; 
     clientCredentials.Windows.ClientCredential.Password = password; 
     clientCredentials.Windows.AllowNtlm = true; 
     clientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; 
    } 
相關問題