내가 할 수있는 요구 사항이 A가 WIF를 사용하여 WCF net.tcp 서비스 엔드 포인트를 스트리밍 보안을 . 토큰 서버에 대한 수신 전화를 인증해야합니다. 서비스는 많은 양의 데이터를 전송하도록 설계되었으므로 스트리밍됩니다.
불가능한 것 같습니다. 그리고 내가 잡을 수 없다면 크리스마스가 망가질 것이고 메리 쇼핑객들이 천천히 차가워지는 몸을 넘어가는 동안 홈통에서 죽을 것입니다. 진지한 토트.
왜 이것이 불가능합니까? 여기 캐치 -22가 있습니다.
클라이언트에서는 토큰 서버에서 얻은 GenericXmlSecurityToken 으로 채널을 만들어야 합니다. 문제 없습니다.
// people around here hate the Framework Design Guidelines.
var token = Authentication.Current._Token;
var service = base.ChannelFactory.CreateChannelWithIssuedToken(token);
return service.Derp();
"문제 없음"이라고 했습니까? 문제. 사실, NullReferenceException
스타일 문제.
"브로,"나는 프레임 워크에 물었다. "널 체크도하지?" 프레임 워크는 침묵했기 때문에 분해하고
((IChannel)(object)tChannel).
GetProperty<ChannelParameterCollection>().
Add(federatedClientCredentialsParameter);
예외의 원인이었으며 GetProperty
호출이를 반환했습니다 null
. 그래서 WTF? 메시지 보안을 설정하고 클라이언트 자격 증명 유형을 IssuedToken
로 설정하면 이 속성이 이제 존재합니다 ClientFactory
.
<binding name="OMGWTFLOL22" transferMode="Streamed" >
<security mode="Message">
<message clientCredentialType="IssuedToken"/>
</security>
</binding>
단. 더 이상 NRE가 없습니다. 그러나 이제 내 의뢰인은 태어날 때 잘못이되었다 (아직도 그를 사랑하라). WCF 진단을 통해 발굴 (팁 : 최악의 적들이 그들을 분쇄하고 당신 앞에서 운전하지만 여성과 아이들의 애가를 즐기기 직전 에이 작업을 수행하도록하십시오), 나는 그것이 서버와 클라이언트 사이의 보안 불일치 때문이라고 생각합니다.
요청한 업그레이드는 'net.tcp : // localhost : 49627 / MyService'에서 지원되지 않습니다. 바인딩이 일치하지 않기 때문일 수 있습니다 (예 : 서버가 아닌 클라이언트에서 사용 가능한 보안).
호스트의 진드기 점검 (다시 : 호감, 운전, 로그 읽기, 애도를 즐기십시오), 이것이 사실임을 알았습니다.
프로토콜 유형 application / ssl-tls가 해당 유형의 업그레이드를 지원하지 않는 서비스로 전송되었습니다.
"자기야, 나는 호스트에서 메시지 보안을 켜겠다!" 그리고 나도 그래 어떻게 보이는지 알고 싶다면 클라이언트 구성의 정확한 사본입니다. 찾다.
결과 : Kaboom.
바인딩 ( 'NetTcpBinding', ' http://tempuri.org/ ')은 메시지 레벨 보안과 함께 구성 할 수없는 스트리밍을 지원합니다. 다른 전송 모드를 선택하거나 전송 수준 보안을 선택하십시오.
따라서 내 호스트는 tokens를 통해 스트리밍 및 보안 될 수 없습니다 . 캐치 -22.
tl; dr : WIF를 사용하여 스트리밍 된 net.tcp WCF 엔드 포인트를 어떻게 보호 할 수 있습니까 ???
TransportWithMessageCredential
mode는 다른 옵션 일 수 있습니다.
<security mode="Transport" /> <transport clientCredentialType="IssuedToken" /> </security>