Tengo un requisito para asegurar un punto final del servicio WCF net.tcp con WIF . Debe autenticar las llamadas entrantes en nuestro servidor de tokens. El servicio se transmite porque está diseñado para transferir grandes cantidades de datos y cosas.
Esto parece ser imposible. Y si no puedo evitar las capturas, mi Navidad se arruinará y moriré de un trago mientras los felices compradores pasan por encima de mi cuerpo que se enfría lentamente. Totalmente en serio, chicos.
¿Por qué es esto imposible? Aquí está el Catch-22.
En el cliente, necesito crear un canal con GenericXmlSecurityToken que obtengo de nuestro servidor de tokens. No hay problema.
// people around here hate the Framework Design Guidelines.
var token = Authentication.Current._Token;
var service = base.ChannelFactory.CreateChannelWithIssuedToken(token);
return service.Derp();
¿Dije "no problemo"? Problemo De hecho, el NullReferenceException
estilo de problema.
"Hermano", le pregunté al Marco, "¿ni siquiera tienes cheque nulo?" El Marco estaba en silencio, así que lo desarme y descubrí que
((IChannel)(object)tChannel).
GetProperty<ChannelParameterCollection>().
Add(federatedClientCredentialsParameter);
fue la fuente de la excepción, y que la GetProperty
llamada estaba regresando null
. Entonces, ¿WTF? Resulta que si enciendo la seguridad del Mensaje y configuro el tipo de credencial del cliente IssuedToken
, esta propiedad ahora existe en ClientFactory
(protip: No hay un equivalente de "SetProperty" en IChannel, el bastardo).
<binding name="OMGWTFLOL22" transferMode="Streamed" >
<security mode="Message">
<message clientCredentialType="IssuedToken"/>
</security>
</binding>
Dulce. No más NRE. Sin embargo, ahora mi cliente tiene una falla al nacer (todavía lo amo, aunque). Excavando los diagnósticos de WCF (resumen: haz que tus peores enemigos hagan esto después de aplastarlos y conducirlos ante ti, pero justo antes de disfrutar de las lamentaciones de sus mujeres y niños), veo que es debido a una falta de coincidencia de seguridad entre el servidor y el cliente.
La actualización solicitada no es compatible con 'net.tcp: // localhost: 49627 / MyService'. Esto podría deberse a enlaces no coincidentes (por ejemplo, seguridad habilitada en el cliente y no en el servidor).
Verificando los diags del host (de nuevo: aplastar, conducir, leer registros, disfrutar lamentaciones), veo que esto es cierto
El tipo de protocolo application / ssl-tls se envió a un servicio que no admite ese tipo de actualización.
"Bueno, yo mismo", le digo, "¡Solo activaré la seguridad de mensajes en el host!" Y yo si. Si desea saber cómo se ve, es una copia exacta de la configuración del cliente. Buscar.
Resultado: Kaboom.
El enlace ('NetTcpBinding', ' http://tempuri.org/ ') admite la transmisión que no se puede configurar junto con la seguridad a nivel de mensaje. Considere elegir un modo de transferencia diferente o elegir el nivel de seguridad de transporte.
Por lo tanto, mi host no se puede transmitir y proteger a través de tokens . 22 capturas.
tl; dr: ¿Cómo puedo asegurar un punto final net.tcp WCF transmitido mediante WIF?
TransportWithMessageCredential
El modo puede ser otra opción.
<security mode="Transport" /> <transport clientCredentialType="IssuedToken" /> </security>