Tengo una aplicación de demostración WCF simple que tiene dos proyectos de consola: host y cliente. Ambos se ejecutan en mi máquina (cuadro de ganar 7). Estoy usando netTcpBinding, que usa la autenticación de Windows.¿Por qué kerberos está por defecto en NTLM en WCF?
El problema es que la autenticación se está degradando a NTLM desde kerberos, y no puedo entender por qué.
Si uso
<clientCredentials>
<windows allowNtlm="true" />
</clientCredentials>
en el lado del cliente, todo es fresco. Pero si cambio que a false
, me sale el siguiente excepción:
SecurityNegotiationException: El servidor remoto no cumplía el requisito de autenticación mutua .
Esto sugiere que kerberos está fallando y dado que el cliente no permitirá NTLM, la llamada genera una excepción.
¿Es este un problema con el proyecto, o es un problema externo causado por la configuración de mi máquina de desarrollo?
Solución:
Al parecer, tengo que especificar la identidad del servidor dentro de la configuración del cliente. En mi caso, el servidor se ejecuta en mi identidad, por lo que modificar el cliente de esta manera:
<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>
No estoy seguro de por qué esto soluciona el problema. De acuerdo, ahora en el lado del cliente confío totalmente en el servidor (hey, ¡lo conozco!). Pero dado que NTLM es menos seguro que kerberos, ¿por qué no es al revés? Si no confío plenamente en el servidor, uso kerberos, de lo contrario ntlm está bien.
O, OTOH, si no confío plenamente en el servidor, ¿por qué funciona en absoluto? "SecurityException: la identidad del punto final no está establecida. WCF no puede confiar en la identidad del servidor y no transmitirá la identidad del cliente".
Parece una pregunta para serverfault.com. – phkahler
solución listada: Kerberos es más seguro por esta razón: el servidor es una fuente confiable y conocida con una identidad garantizada tanto en términos de direcciones ** como ** que se ejecutan en esa dirección. Una cuenta de servicio que se ejecuta como un usuario diferente no podrá procesar su solicitud. – Hogan
@hogan Creo que curb/ntlm es más acerca de la autenticación que de la autorización. Permítanme autenticarme con cualquier servidor que use el bordillo; una vez que sé quién es el servicio, puedo decidir si quiero tratar con ellos. Si me autentico con el bordillo, tengo la identidad del servicio proporcionado por un tercero de confianza (AD). Si el servicio está siendo falsificado, puedo decir por esa identidad y lanzar una excepción si no se espera. En WCF, parece que un servidor falso fallará el bordillo y luego pasará con ntlm. Eso no me parece seguro. Autenticémonos con cualquiera, tira si no son lo que esperaba. – Will