Saya memiliki persyaratan untuk mengamankan titik akhir layanan WCF net.tcp menggunakan WIF . Seharusnya mengotentikasi panggilan masuk terhadap server token kami. Layanan dialirkan karena dirancang untuk mentransfer sejumlah besar data dan barang.
Tampaknya ini mustahil. Dan jika saya tidak bisa mengatasi tangkapan, Natal saya akan hancur dan saya akan minum sampai mati dalam selokan sementara pembeli yang ceria melangkahi tubuh saya yang perlahan-lahan dingin. Totes serius, kalian.
Mengapa ini tidak mungkin? Inilah Catch-22.
Di klien, saya perlu membuat saluran dengan GenericXmlSecurityToken yang saya dapatkan dari server token kami. Tidak masalah.
// people around here hate the Framework Design Guidelines.
var token = Authentication.Current._Token;
var service = base.ChannelFactory.CreateChannelWithIssuedToken(token);
return service.Derp();
Apakah saya mengatakan "tidak masalah"? Problemo. Bahkan, NullReferenceException
style problemo.
"Bro," aku bertanya pada Framework, "apakah kamu bahkan membatalkan cek?" Kerangka kerja itu diam, jadi saya membongkar dan menemukan itu
((IChannel)(object)tChannel).
GetProperty<ChannelParameterCollection>().
Add(federatedClientCredentialsParameter);
adalah sumber pengecualian, dan bahwa GetProperty
panggilan itu kembali null
. Jadi, WTF? Ternyata jika saya mengaktifkan Keamanan pesan dan menetapkan tipe kredensial klien untuk IssuedToken
maka properti ini sekarang ada di ClientFactory
(protip: Tidak ada setara "SetProperty" di IChannel, bajingan itu).
<binding name="OMGWTFLOL22" transferMode="Streamed" >
<security mode="Message">
<message clientCredentialType="IssuedToken"/>
</security>
</binding>
Manis. Tidak ada lagi NRE. Namun, sekarang klien saya salah sejak lahir (masih mencintainya, tho). Menggali melalui diagnosa WCF (protip: membuat musuh terburuk Anda melakukan ini setelah menghancurkan mereka dan mengarahkan mereka sebelum Anda tetapi tepat sebelum menikmati ratapan wanita dan anak-anak mereka), saya melihat itu karena ketidakcocokan keamanan antara server dan klien.
Pembaruan yang diminta tidak didukung oleh 'net.tcp: // localhost: 49627 / MyService'. Ini bisa jadi karena binding yang tidak cocok (misalnya keamanan diaktifkan pada klien dan bukan pada server).
Memeriksa diags host (lagi: naksir, drive, baca log, nikmati ratapan), saya melihat ini benar
Aplikasi Jenis Protokol / ssl-tls dikirim ke layanan yang tidak mendukung jenis peningkatan itu.
"Yah, sendiri," kataku, "Aku hanya akan mengaktifkan keamanan pesan pada tuan rumah!" Dan saya lakukan. Jika Anda ingin tahu seperti apa itu, itu adalah salinan persis konfigurasi klien. Menengadah.
Hasil: Kaboom.
Penjilidan ('NetTcpBinding', ' http://tempuri.org/ ') mendukung streaming yang tidak dapat dikonfigurasi bersama dengan keamanan tingkat pesan. Pertimbangkan memilih mode transfer yang berbeda atau memilih keamanan tingkat transportasi.
Jadi, host saya tidak dapat di-stream dan diamankan melalui token . Catch-22.
tl; dr: Bagaimana cara mengamankan endpoint WCF net.tcp yang dialirkan menggunakan WIF ???
TransportWithMessageCredential
mode dapat menjadi pilihan lain.
<security mode="Transport" /> <transport clientCredentialType="IssuedToken" /> </security>