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."
Questa sembra una domanda per serverfault.com. – phkahler
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
@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