У мене є вимога захистити поточну кінцеву точку служби WCF net.tcp за допомогою WIF . Він повинен ідентифікувати вхідні дзвінки проти нашого сервера токенів. Послуга передається в потоковому режимі, оскільки вона призначена для передачі великої кількості даних n матеріалів.
Це видається неможливим. І якщо я не зможу обійти улов, моє Різдво зіпсується, і я вип'ю себе на смерть у жолобі, поки веселі покупці перейдуть на моє повільно охолоджене тіло. Дуже серйозно, хлопці.
Чому це неможливо? Ось Catch-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
(protip: у IChannel, ублюдок, немає еквівалента "SetProperty").
<binding name="OMGWTFLOL22" transferMode="Streamed" >
<security mode="Message">
<message clientCredentialType="IssuedToken"/>
</security>
</binding>
Солодке. Більше немає НРЕ. Однак зараз мій клієнт винен при народженні (все одно люблю його, тхо). Копаючи діагностику WCF (протип: змушуйте своїх найгірших ворогів робити це після того, як їх розчавлять і загнали перед вами, але прямо перед тим, як насолоджуватися скаргами їх жінок і дітей), я бачу, що це відбувається через невідповідність безпеки між сервером і клієнтом.
Запитане оновлення не підтримується 'net.tcp: // localhost: 49627 / MyService'. Це може бути пов'язано з невідповідними прив'язками (наприклад, безпека увімкнена на клієнті, а не на сервері).
Перевіряючи діалоги хоста (знову: розчавити, керувати, читати журнали, насолоджуватися голосом), я бачу, що це правда
Програма протоколу / ssl-tls була надіслана службі, яка не підтримує цей тип оновлення.
"Ну, я", - кажу я, - я просто ввімкну захист повідомлення від хоста! І я. Якщо ви хочете знати, як це виглядає, це точна копія конфігурації клієнта. Подивіться.
Результат: Кабум.
Прив'язка ('NetTcpBinding', ' http://tempuri.org/ ') підтримує потокове передавання, яке неможливо налаштувати разом із захистом рівня повідомлень. Подумайте про вибір іншого способу передачі або безпеку транспортного рівня.
Таким чином, мій хост не може бути як потоковим, так і захищеним через жетони . Ловля-22.
tl; dr: Як я можу захистити поточну кінцеву точку net.tcp WCF за допомогою WIF ???
TransportWithMessageCredential
режим може бути іншим варіантом.
<security mode="Transport" /> <transport clientCredentialType="IssuedToken" /> </security>