У меня есть требование защитить потоковый конечный пункт службы WCF net.tcp с использованием WIF. Он должен аутентифицировать входящие вызовы на нашем токен-сервере. Услуга передается потоком, поскольку она предназначена для передачи больших объемов данных.
Это кажется невозможным. И если я не смогу обойти улов, мое Рождество будет разрушено, и я выпью себя до смерти в сточной канаве, в то время как веселые покупатели перешагнут на меня медленно охлаждающий корпус. Ребята, вы решились серьезно.
Почему это невозможно? Здесь 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();
Я сказал "no problemo"? Problemo. На самом деле, NullReferenceException
style problemo.
"Бро, - спросил я в" Рамочной программе ", - вы даже не проверяете? Рамка была безмолвной, поэтому я разобрался и обнаружил, что
((IChannel)(object)tChannel).
GetProperty<ChannelParameterCollection>().
Add(federatedClientCredentialsParameter);
был источником исключения и что вызов GetProperty
возвращался null
. Итак, WTF? Оказывается, если я включу защиту сообщений и настрою тип учетных данных клиента на IssuedToken
, то это свойство теперь существует в ClientFactory
(protip: эквивалент "SetProperty" в IChannel, ублюдок).
<binding name="OMGWTFLOL22" transferMode="Streamed" >
<security mode="Message">
<message clientCredentialType="IssuedToken"/>
</security>
</binding>
Сладкое. Больше NRE. Тем не менее, теперь мой клиент ошибается при рождении (по-прежнему любите его, tho). Копая через диагностику WCF (протапывайте: сделайте так, чтобы ваши худшие враги сделали это после того, как раздавили их и водили их перед вами, но прямо перед тем, как наслаждаться жалобами своих женщин и детей), я вижу это из-за несоответствия безопасности между сервером и клиентом.
Запрошенное обновление не поддерживается "net.tcp://localhost: 49627/MyService". Это может быть связано с несогласованными привязками (например, защита включена на клиенте, а не на сервере).
Проверка хостов (снова: раздавить, диск, читать журналы, наслаждаться плачами), я вижу, что это правда
Приложение типа протокола /ssl -tls было отправлено службе, которая не поддерживает этот тип обновления.
"Ну, я, - говорю я, - я просто включу защиту сообщений на хосте!" И я делаю. Если вы хотите знать, как это выглядит, это точная копия конфигурации клиента. Посмотрите вверх.
Результат: Kaboom.
Связывание ('NetTcpBinding', 'http://tempuri.org/') поддерживает потоковое вещание, которое невозможно настроить вместе с безопасностью уровня сообщений. Рассмотрите возможность выбора другого режима передачи или выбора безопасности транспортного уровня.
Итак, мой хост не может быть потоковым и защищенным с помощью токенов. Catch-22.
tl; dr: Как я могу защитить поточную конечную точку WCF net.tcp с помощью WIF???