मुझे WIF का उपयोग करके एक स्ट्रीम WCF net.tcp सर्विस एंडपॉइंट को सुरक्षित करने की आवश्यकता है । यह हमारे टोकन सर्वर के खिलाफ आने वाली कॉल को प्रमाणित करना चाहिए। सेवा को स्ट्रीम किया गया है क्योंकि यह बड़ी मात्रा में डेटा एन सामान को स्थानांतरित करने के लिए डिज़ाइन किया गया है।
यह असंभव प्रतीत होता है। और अगर मैं पकड़ में नहीं आ सका, तो मेरा क्रिसमस बर्बाद हो जाएगा और मैं अपने आप को एक गटर में मरने के लिए पी लूंगा, जबकि मेरी दुकानदार धीरे-धीरे ठंडा होने वाले शरीर पर कदम रखेंगे। टोट्स गंभीर, आप लोग।
यह असंभव क्यों है? यहां कैच -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
शैली समस्या।
"भाई," मैंने फ्रेमवर्क से पूछा, "क्या आप भी चेक करते हैं?" फ्रेमवर्क चुप था, इसलिए मैं असंतुष्ट था और उसने पाया
((IChannel)(object)tChannel).
GetProperty<ChannelParameterCollection>().
Add(federatedClientCredentialsParameter);
अपवाद का स्रोत था, और यह कि GetProperty
कॉल वापस आ रहा था null
। तो, डब्ल्यूटीएफ? यह बताता है कि यदि मैं संदेश सुरक्षा को चालू करता हूं और क्लाइंट क्रेडेंशियल प्रकार सेट करता हूं, IssuedToken
तो यह संपत्ति अब ClientFactory
(प्रॉपिप: आईसीहनेल, बस्टर्ड में बराबर "सेटप्रॉपर्टी) में मौजूद है।
<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: मैं WIF का उपयोग करके एक स्ट्रीम net.tcp WCF समापन बिंदु कैसे सुरक्षित कर सकता हूं ???
TransportWithMessageCredential
मोड एक और विकल्प हो सकता है।
<security mode="Transport" /> <transport clientCredentialType="IssuedToken" /> </security>