Mam wymaganie zabezpieczenia punktu końcowego usługi net.tcp usługi WCF za pomocą WIF . Powinien on uwierzytelniać połączenia przychodzące przeciwko naszemu serwerowi tokenów. Usługa jest przesyłana strumieniowo, ponieważ jest przeznaczona do przesyłania dużych ilości danych i innych rzeczy.
To wydaje się niemożliwe. A jeśli nie uda mi się obejść haczyka, moje Boże Narodzenie zostanie zrujnowane i wypiję się na śmierć w rynsztoku, podczas gdy wesoło kupujący przechodzą nad moim powoli ochładzającym się ciałem. Poważnie, chłopaki.
Dlaczego to jest niemożliwe? Oto Catch-22.
Na kliencie muszę utworzyć kanał z GenericXmlSecurityToken, który otrzymuję z naszego serwera tokenów. Bez problemu.
// people around here hate the Framework Design Guidelines.
var token = Authentication.Current._Token;
var service = base.ChannelFactory.CreateChannelWithIssuedToken(token);
return service.Derp();
Czy powiedziałem „bez problemu”? Problemo W rzeczywistości NullReferenceException
problem stylu.
„Bro”, zapytałem Framework, „czy w ogóle sprawdzasz zerowo?” Framework był cichy, więc zdemontowałem i znalazłem to
((IChannel)(object)tChannel).
GetProperty<ChannelParameterCollection>().
Add(federatedClientCredentialsParameter);
było źródłem wyjątku i że GetProperty
połączenie było zwracane null
. Więc WTF? Okazuje się, że jeśli włączę Zabezpieczenia wiadomości i ustawię typ poświadczenia klienta na, IssuedToken
wówczas ta właściwość istnieje teraz w ClientFactory
(protip: Nie ma odpowiednika „SetProperty” w IChannel, draniu).
<binding name="OMGWTFLOL22" transferMode="Streamed" >
<security mode="Message">
<message clientCredentialType="IssuedToken"/>
</security>
</binding>
Słodkie. Nigdy więcej NRE. Jednak teraz mój klient ma wadę od urodzenia (nadal go kocham, tho). Przekopując się przez diagnostykę WCF (protip: zmuś swoich najgorszych wrogów do zrobienia tego po zmiażdżeniu ich i poprowadzeniu ich przed tobą, ale tuż przed czerpaniem przyjemności z rozpaczy ich kobiet i dzieci), widzę, że jest to spowodowane niedopasowaniem bezpieczeństwa między serwerem a klientem.
Żądana aktualizacja nie jest obsługiwana przez „net.tcp: // localhost: 49627 / MyService”. Przyczyną może być niedopasowane powiązania (na przykład zabezpieczenia włączone na kliencie, a nie na serwerze).
Sprawdzając diagi gospodarza (ponownie: zmiażdż, jeźdź, czytaj dzienniki, ciesz się lamentami), widzę, że to prawda
Typ protokołu application / ssl-tls został wysłany do usługi, która nie obsługuje tego typu aktualizacji.
„Cóż, ja” - mówię - po prostu włączę ochronę wiadomości na hoście! I ja tak. Jeśli chcesz wiedzieć, jak to wygląda, jest to dokładna kopia konfiguracji klienta. Sprawdzać.
Wynik: Kaboom.
Powiązanie („NetTcpBinding”, „ http://tempuri.org/ ”) obsługuje przesyłanie strumieniowe, którego nie można skonfigurować razem z zabezpieczeniami na poziomie wiadomości. Zastanów się nad wyborem innego trybu przesyłania lub zabezpieczeniem na poziomie transportu.
Tak więc mój host nie może być przesyłany strumieniowo i zabezpieczany za pomocą tokenów . Złap 22.
tl; dr: Jak zabezpieczyć strumieniowany punkt końcowy WCF net.tcp za pomocą WIF ???
TransportWithMessageCredential
tryb może być inną opcją.
<security mode="Transport" /> <transport clientCredentialType="IssuedToken" /> </security>