ฉันมีความต้องการไปสู่การรักษาความปลอดภัยการสตรีม WCF net.tcp ปลายทางบริการโดยใช้ WIF ควรตรวจสอบการโทรเข้ากับเซิร์ฟเวอร์โทเค็นของเรา บริการถูกสตรีมเนื่องจากถูกออกแบบมาเพื่อถ่ายโอนข้อมูลจำนวนมากและสิ่งต่าง ๆ
ดูเหมือนว่าจะเป็นไปไม่ได้ และถ้าฉันไม่สามารถจับได้คริสต์มาสของฉันจะถูกทำลายและฉันจะดื่มจนตายในรางน้ำในขณะที่นักช้อปผู้ร่าเริงเดินผ่านร่างกายที่เย็นตัวลงอย่างช้าๆของฉัน Totes จริงจังพวกคุณ
ทำไมเป็นไปไม่ได้ นี่คือ 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();
ฉันว่า "ไม่มีปัญหา" หรือเปล่า? problemo ในความเป็นจริงNullReferenceException
ปัญหาสไตล์
"Bro," ฉันถาม Framework, "คุณตรวจสอบเป็นโมฆะหรือไม่" Framework ทำงานเงียบฉันเลยถอดออกและพบว่า
((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>
หวาน. ไม่มี NREs อีกต่อไป อย่างไรก็ตามตอนนี้ลูกค้าของฉันเกิดข้อผิดพลาดตั้งแต่แรกเกิด (ยังคงรักเขาอยู่) ขุดผ่านการวินิจฉัยของ WCF (protip: ทำให้ศัตรูที่เลวร้ายที่สุดของคุณทำสิ่งนี้หลังจากที่พวกมันบดขยี้และขับไล่พวกเขาไปข้างหน้าคุณ แต่ก่อนที่จะเพลิดเพลินไปกับความเศร้าโศกของผู้หญิงและเด็ก ๆ )
การอัพเกรดที่ร้องขอไม่รองรับโดย 'net.tcp: // localhost: 49627 / MyService' อาจเกิดจากการรวมที่ไม่ตรงกัน (ตัวอย่างเช่นความปลอดภัยที่เปิดใช้งานบนไคลเอ็นต์และไม่ได้อยู่บนเซิร์ฟเวอร์)
ตรวจสอบ diags โฮสต์ (อีกครั้ง: บดขยี้ขับอ่านบันทึกเพลิดเพลินไปกับการคร่ำครวญ) ฉันเห็นว่านี่เป็นความจริง
แอปพลิเคชันประเภทโปรโตคอล / ssl-tls ถูกส่งไปยังบริการที่ไม่รองรับการอัปเกรดประเภทนั้น
"ดีตัวเอง" ฉันพูดว่า "ฉันจะเปิดการรักษาความปลอดภัยข้อความบนโฮสต์!" และฉันก็ทำ หากคุณต้องการรู้ว่ามันเป็นอย่างไรมันเป็นสำเนาที่แน่นอนของการกำหนดค่าไคลเอนต์ เงยหน้าขึ้นมอง
ผลลัพธ์: Kaboom
การเชื่อมโยง ('NetTcpBinding', ' http://tempuri.org/ ') รองรับการสตรีมซึ่งไม่สามารถกำหนดค่าพร้อมความปลอดภัยระดับข้อความ พิจารณาเลือกโหมดการถ่ายโอนอื่นหรือเลือกระดับความปลอดภัยของการขนส่ง
ดังนั้นโฮสต์ของฉันไม่สามารถเป็นได้ทั้งแบบสตรีมและการรักษาความปลอดภัยผ่านทางราชสกุล จับ 22.
tl; dr: ฉันจะรักษาความปลอดภัยให้กับจุดสิ้นสุด WCF net.tcp ที่สตรีมโดยใช้ WIF ได้อย่างไร
TransportWithMessageCredential
โหมดอาจเป็นตัวเลือกอื่น
<security mode="Transport" /> <transport clientCredentialType="IssuedToken" /> </security>