Tenho um requisito para proteger um ponto de extremidade do serviço net.tcp do WCF transmitido usando WIF . Ele deve autenticar as chamadas recebidas no nosso servidor de token. O serviço é transmitido porque foi projetado para transferir grandes quantidades de dados e coisas.
Isso parece ser impossível. E se eu não conseguir contornar o problema, meu Natal será arruinado e eu me matarei até a sarjeta enquanto compradores alegres passam por cima do meu corpo lentamente esfriando. É sério, pessoal.
Por que isso é impossível? Aqui está o Catch-22.
No cliente, preciso criar um canal com o GenericXmlSecurityToken que recebo do nosso servidor de token. Não há problema.
// people around here hate the Framework Design Guidelines.
var token = Authentication.Current._Token;
var service = base.ChannelFactory.CreateChannelWithIssuedToken(token);
return service.Derp();
Eu disse "no problemo"? Problemo. De fato, NullReferenceException
estilo problemo.
"Bro", perguntei ao Framework, "você checa mesmo?" O Framework ficou em silêncio, então eu desmontei e descobri que
((IChannel)(object)tChannel).
GetProperty<ChannelParameterCollection>().
Add(federatedClientCredentialsParameter);
foi a fonte da exceção e que a GetProperty
chamada estava retornando null
. Então, WTF? Acontece que, se eu ativar a Segurança da mensagem e definir o tipo de credencial do cliente IssuedToken
, essa propriedade agora existe no ClientFactory
(protip: Não há "SetProperty" equivalente no IChannel, o bastardo).
<binding name="OMGWTFLOL22" transferMode="Streamed" >
<security mode="Message">
<message clientCredentialType="IssuedToken"/>
</security>
</binding>
Doce. Não há mais NREs. No entanto, agora meu cliente é culpado de nascença (ainda o amo). Indo além dos diagnósticos do WCF (protip: faça seus piores inimigos fazer isso depois de esmagá-los e levá-los diante de você, mas antes de apreciar as lamentações de mulheres e crianças), vejo que é por causa de uma incompatibilidade de segurança entre o servidor e o cliente.
A atualização solicitada não é suportada por 'net.tcp: // localhost: 49627 / MyService'. Isso pode ocorrer devido a ligações incompatíveis (por exemplo, segurança ativada no cliente e não no servidor).
Verificando as diags do host (novamente: esmague, dirija, leia logs, desfrute de lamentações), vejo que isso é verdade
O tipo de protocolo application / ssl-tls foi enviado para um serviço que não suporta esse tipo de atualização.
"Bem, eu", eu digo, "ativarei a segurança de mensagens no host!" E eu faço. Se você quiser saber como é, é uma cópia exata da configuração do cliente. Olho para cima.
Resultado: Kaboom.
A ligação ('NetTcpBinding', ' http://tempuri.org/ ') suporta streaming que não pode ser configurado junto com a segurança no nível da mensagem. Considere escolher um modo de transferência diferente ou escolher a segurança no nível de transporte.
Portanto, meu host não pode ser transmitido nem protegido por tokens . Catch-22.
tl; dr: Como posso proteger um ponto de extremidade net.tcp WCF transmitido usando WIF ???
TransportWithMessageCredential
O modo pode ser outra opção.
<security mode="Transport" /> <transport clientCredentialType="IssuedToken" /> </security>