2010-02-23 13 views
7

Hai ottenuto una semplice app per la demo di WCF con due progetti di console: host e client. Entrambi sono in esecuzione sulla mia macchina (vinci 7 box). Sto usando netTcpBinding, che usa l'autenticazione di Windows.Perché kerberos si imposta automaticamente su NTLM in WCF?

Il problema è che l'autenticazione sta eseguendo il downgrade a NTLM da Kerberos e non riesco a capire perché.

Se uso

<clientCredentials> 
    <windows allowNtlm="true" /> 
</clientCredentials> 

sul lato client, tutto è fresco. Ma se cambio che a false, ottengo la seguente eccezione:

SecurityNegotiationException: il server remoto non soddisfaceva il requisito di autenticazione reciproca .

Ciò suggerisce che kerberos non funziona e poiché il client non consente a NTLM la chiamata genera un'eccezione generata.

Si tratta di un problema con il progetto o si tratta di un problema esterno causato dalla configurazione della mia macchina di sviluppo?


Soluzione:

A quanto pare, devo specificare l'identità del server all'interno della configurazione del client. Nel mio caso, il server è in esecuzione con la mia identità, in modo da modificare il client così:

<client> 
    <endpoint address="net.tcp://dev7.HurrDurr.com:12345/MyService" 
      binding="netTcpBinding" 
      bindingConfiguration="MyBindingConfigurationLol" 
      behaviorConfiguration="HurrDurrServiceEndpoint" 
      contract="ShaolinCore.ICommunicationService"> 
    <!-- start changes here --> 
    <identity> 
     <userPrincipalName value="[email protected]"/> 
    </identity> 
    <!-- end changes here --> 
    </endpoint> 
</client> 

Io non sono sicuro perché questo risolve il problema. Ok, ora sul lato client mi fido del server (hey, lo conosco!). Ma dal momento che NTLM è meno sicuro di Kerberos, perché non è il contrario? Se non mi fido del server, uso kerberos, altrimenti ntlm va bene.

Oppure, OTOH, se non mi fido del server perché funziona? "SecurityException: identità dell'endpoint non impostata, WCF non può fidarsi dell'identità del server e non trasmetterà l'identità del client."

+0

Questa sembra una domanda per serverfault.com. – phkahler

+0

soluzione elencata: Kerberos è più sicuro proprio per questo motivo: il server è una fonte attendibile e nota con un'identità garantita sia in termini di indirizzo ** che ** processo in esecuzione a quell'indirizzo. Un account di servizio in esecuzione come utente diverso non sarebbe in grado di elaborare la richiesta. – Hogan

+0

@hogan Penso che il ciglio/ntlm sia più sull'autenticazione che sull'autorizzazione. Fammi autenticare con qualsiasi server che usa il cordolo; una volta che so chi è il servizio, posso decidere se voglio occuparmi di loro. Se effettuo l'autenticazione con il freno, ho l'identità del servizio fornito da una terza parte attendibile (AD). Se il servizio è stato oggetto di spoofing, posso dirlo con quella identità e generare un'eccezione se non è prevista. In WCF, sembra che un server con spoofing fallirebbe e poi passasse con ntlm. Questo non mi sembra sicuro. Autentica con chiunque, butta se non sono chi mi aspettavo. – Will

risposta

7

Quando ho lavorato ai team di sviluppo IIS4, 5 e 6, ci siamo imbattuti in questo!Per Curb al lavoro, sono necessari i seguenti condizioni per essere vero:

1) Entrambe le parti sostengono marciapiede (tutte le versioni supportate di Curb il supporto di Windows oggi)

2) Macchine autenticazione ad Active Directory

3) Nomi principali del servizio (SPN) registrati per l'endpoint del server. Nei "bei vecchi tempi" dovevi farlo manualmente usando SetSPN.exe. Un SPN è solo un punto finale a cui Curb si connetterà; ha bisogno di questi dati per supportare l'authn reciproco. La maggior parte delle applicazioni saranno chiamano l'API approp a questo lavoro per voi (DsWriteAccountSpn)

Se uno dei passaggi di cui sopra non sono vere, Windows solito predefinito NTLM, pagherei ti dà solo l'autenticazione del client.

Spero che questo aiuti! - Michael

+0

Ho letto un libro o due sulla sicurezza di Windows, e talvolta è ancora confuso. Non capisco come WCF gestisce anche l'autenticazione reciproca, quindi lo rende doppiamente difficile. Perché devo fornire al server UPN/SPN/DNS per abilitare il freno sul client? Se non mi fido del server, perché ntlm è meglio del freno? O il cliente ha bisogno di fornire l'identità del servizio a terzi? Perché il servizio non può fornirlo direttamente? Perché mi fa male la testa? – Will

+0

Curb ha bisogno di autenticare il client e il server e con questo intendo i * computer *. Quando il tuo codice cliente (WCF) effettua una richiesta per connettersi a un servizio, ha bisogno di sapere esattamente * a cosa si connette, quindi un amministratore deve aggiungere il SPN per l'applicazione server ad AD - in pratica stai dicendo a Curb "Ho bisogno di connettermi a questo SPN". In molti casi, il lato server dell'equazione * WILL * regeister un SPN ma solo se è in grado di farlo. NTLM non è migliore di Curb, NTLM autentica solo un client, quindi il server sa chi sei, ma non hai idea di chi ti stai connettendo. –

+0

Inoltre: kerberos può essere utilizzato solo quando si richiama il servizio tramite un nome DNS. Invocare il servizio tramite l'indirizzo IP comporterà l'utilizzo di NTLM – bug

1

Come è configurato il server? Avete il <authentication mode="Windows"/> e <identity impersonate="true"/> nel file di configurazione?

si imposta la modalità di autenticazione tramite il tag di autenticazione nel file di configurazione:

<configuration> 
    <system.web> 
    <authentication mode="Windows" /> 
    </system.web> 
</configuration> 
+0

Penso che questi si applicano solo ai binding http. Sto specificando che il mio clientCredentialType è Windows, comunque. – Will

+0

Di nuovo, funziona se il client consente di ntlm, altrimenti fallisce (nel senso, credo, kerberos non è disponibile). – Will

+0

AFAIK non si applicano solo a http. – Hogan

1

Forse questa pagina su MSDN - Debugging Windows Authentication Errors - aiuta a capire cosa sta succedendo - sembra essere abbastanza difficile da quando NTLM vs Kerberos è in uso.

+0

k ... utente del dominio su entrambe le estremità, controllo. URL completo, aggiornato, nessuna differenza. Aggiunta identità/UPN ... nessuna differenza. Configurazione dell'identità SPN sul client ... BINGO! – Will

+0

@Will: Cool, stavo per suggerire di controllare gli SPN sul server e sul client. – Hogan

1

Fyi tramite MSDN: netTcpBinding: l'associazione predefinita utilizza la sicurezza del trasporto con autenticazione negoziata. Questa negoziazione tenta di utilizzare Kerberos, ma se non funziona, ricadrà e utilizzerà il precedente protocollo NTLM. Kerberos è un'ottima scelta se ti trovi in ​​un ambiente di dominio; per poterlo utilizzare, è necessario che sia il servizio che i client siano in esecuzione con gli account di dominio. Dovrai anche configurare un nome principale del servizio (SPN) per il tuo servizio.

+0

Quindi, in teoria, dopo aver letto i tuoi commenti che non ho letto inizialmente, il comportamento sembra essere di progettazione. – kd7

Problemi correlati