2011-02-07 7 views
11

Durante la chiamata di un servizio Web ottengo il seguente errore:La richiesta HTTP non è autorizzato con lo schema di autenticazione client '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'.

Ho un 4 applicazione Silverlight che chiama un servizio Web WCF, sia sul mio IIS (7). Il servizio Web WCF chiama un altro servizio Web ASMX, installato su un server Web diverso, utilizzando NTLM (autenticazione di Windows). Entrambi i server, il mio e quello che ospita il servizio Web ASMX si trovano nello stesso dominio.

Quando il client Silverlight apre l'applicazione dal server utilizzando http://localhost/MySiteName, tutto funziona correttamente. Ma quando il client Silverlight apre l'applicazione da un client diverso, che non è il server ma si trova ancora nello stesso dominio, utilizzando http://MyServerName/MySiteName, viene visualizzato l'errore.

L'autenticazione di Windows è abilitata nel mio IIS. L'autenticazione anonima è disabilitata nel mio IIS.

Binding configurazione per chiamare il mio servizio web WCF è:

<binding name="winAuthBasicHttpBinding"> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Windows" /> 
     </security> 
    </binding> 

configurazione di rilegatura per chiamare il servizio Web ASMX è:

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

configurazione di rilegatura per chiamare il mio servizio web WCF è : configurazione di rilegatura per chiamare il servizio web ASMX è: kruvi

risposta

18

OK, qui sono le cose che vengono in mente:

  • Il servizio WCF presumibilmente in esecuzione su IIS deve essere in esecuzione nel contesto di sicurezza che ha il privilegio di t chiama il servizio Web. È necessario assicurarsi nel pool di app con un utente che è un utente di dominio - idealmente un utente dedicato.
  • Non si può utilizzare la rappresentazione di utilizzare token di protezione dell'utente per passare di nuovo a ASMX utilizzando la rappresentazione dal my WCF web service calls another ASMX web service, installed on a **different** web server
  • Provare a cambiare Ntlm a Windows e prova di nuovo.

OK, qualche parola sulla rappresentazione. Fondamentalmente è un problema noto che non è possibile utilizzare i token di rappresentazione che si è arrivati ​​a un server, per passare a un altro server. La ragione sembra essere che il token è una specie di hash che usa la password dell'utente e valida per la macchina generata da quindi non può essere usata dal server centrale.


UPDATE

delegazione è possibile in WCF (vale a dire l'inoltro rappresentazione da un server a un altro server). Guarda questo argomento here.

+0

Grazie. Quando imposto un utente del dominio al pool di app funziona correttamente, ma ora tutte le mie chiamate al WS vengono eseguite sotto l'utente del dominio del pool di app. Non riesco a chiamare ASMX ws utilizzando la rappresentazione, quindi la chiamata viene eseguita con il token di sicurezza dell'utente del client? – kruvi

+0

BTW, ho dimenticato di menzionare che quando si utilizza la rappresentazione con un utente specifico (lo stesso utente che ha effettuato l'accesso al client) tutto funziona correttamente: client = new ClCustomersServiceClient(); client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; client.ClientCredentials.Windows.ClientCredential = new NetworkCredential ("username", "password", "dominio"); risposta = client.ClCustomersQuery (richiesta); – kruvi

+0

Ho aggiornato, dai un'occhiata. – Aliostad

7

È passato molto tempo da quando è stata inviata la domanda, ma ho riscontrato lo stesso problema in uno scenario simile. Ho un'applicazione console e stavo consumando un servizio web e il nostro server IIS su cui è stato posizionato il servizio web ha abilitato l'autenticazione Windows (NTLM).

Ho seguito this link e ho risolto il problema.Ecco il codice di esempio per 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) ho dovuto fare le seguenti operazioni con la mia configurazione: (Aggiungere BackConnectionHostNames o Disabilita Loopback Check) http://support.microsoft.com/kb/896861

2) stavo lavorando fuori un sistema dev su una rete di sviluppo isolata. Avevo funzionato usando il nome del computer del sistema di sviluppo nell'URL del servizio web, ma quando ho modificato l'URL per l'URL che sarebbe stato utilizzato nella produzione (piuttosto che il nome del computer), ho iniziato a ricevere l'errore NTLM.

3) Ho notato che il registro di sicurezza mostrava che l'account di servizio non riusciva ad accedere con un errore simile a quello nell'articolo di MSDN.

4) L'aggiunta di BackConnectionHostNames ha consentito l'accesso al server tramite un browser in esecuzione sul server, ma l'account di servizio presentava ancora errori NTLM durante il tentativo di autenticazione per i servizi Web. Ho finito per disabilitare il controllo del loopback e questo lo ha risolto per me.

0

Forse si può fare riferimento a: http://msdn.microsoft.com/en-us/library/ms731364.aspx La mia soluzione è quella di cambiare di 2 immobili AuthenticationScheme e proxyAuthenticationScheme a "NTLM", e allora funziona.

PS: Il mio ambiente è come seguire - lato Server: .net 2.0 ASMX - lato client: .net 4

1

ho dovuto spostare dominio, nome utente, password da

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

a

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

2

Per me la soluzione è stata oltre ad utilizzare "NTLM" come tipo di credenziali, simile come la soluzione di Jeroen K. Se ho avuto il livello di autorizzazione lo farei più il suo posto, ma mi permetta di postare tutto il mio codice qui, che sosterrà sia Windows e di altri tipi di credenziali come autenticazione di base:

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; 
    } 
Problemi correlati