2008-12-30 7 views
5

का उपयोग कर बनाया जा रहा है अभी तक कई जिनेवा से संबंधित प्रश्नों के नहीं देखा है, मैं भी Geneva Forum में यह सवाल पोस्ट किया है ...एक स्थानीय टोकन कैश जिनेवा फ्रेमवर्क

मैं जहां हम एक है एक परिदृश्य पर काम कर रहा हूँ व्यापक इंस्टॉलबेस के साथ फॉर्म ऐप जीतें, जो पूरे ऑपरेशन में केंद्रीय रूप से हमारे द्वारा होस्ट की गई विभिन्न सेवाओं को लगातार कॉल जारी करेगा।

सेवाएं सभी जिनेवा फ्रेमवर्क का उपयोग कर रही हैं और सभी क्लाइंटों को हमारी एसटीएस को कॉल करने की उम्मीद है ताकि सेवाओं तक पहुंच की अनुमति दी जा सके।

ws2007FederationHttp बाइंडिंग का उपयोग करके बॉक्स में से, ऐप को प्रत्येक सेवा कॉल से पहले एसटीएस से टोकन पुनर्प्राप्त करने के लिए कॉन्फ़िगर किया जा सकता है, लेकिन जाहिर है यह सबसे प्रभावी तरीका नहीं है क्योंकि हम लगभग कॉल करने के प्रयास को डुप्लिकेट कर रहे हैं सेवाएं।

वैकल्पिक रूप से, मैंने ऐप से "मैन्युअल रूप से" टोकन को पुनर्प्राप्त करने के लिए आवश्यक कोड लागू किया है, और फिर सेवाओं पर संचालन को कॉल करते समय वही प्री-पुनर्प्राप्त टोकन पास करें (WSTrustClient नमूना के आधार पर और फ़ोरम में सहायता करें); जो अच्छी तरह से काम करता है और इसलिए हमारे पास समाधान है, लेकिन मुझे विश्वास है कि यह बहुत ही सुरुचिपूर्ण नहीं है क्योंकि इसे डब्ल्यूसीएफ चैनल को कोड में बनाने की आवश्यकता है, जो अद्भुत डब्ल्यूसीएफ कॉन्फ़िगरेशन से दूर हो रहा है।

मैं ws2007FederationHttp बाइंडिंग दृष्टिकोण को बहुत पसंद करता हूं जहां क्लाइंट द्वारा जिनेवा के बारे में कुछ भी जानने के बिना, बस किसी भी अन्य डब्ल्यूसीएफ सेवा की तरह सेवा को कॉल करता है, और बाइंडिंग टोकन एक्सचेंज का ख्याल रखती है।

फिर किसी ने (जॉन सिम्पसन) ने मुझे [जो मुझे लगता है] एक अच्छा विचार दिया - एक सेवा जोड़ें, जो ऐप में स्थानीय रूप से पुनर्प्राप्त टोकन को कैश करने के लिए होस्ट किया गया है। स्थानीय कैश सेवा एसटीएस के समान अनुबंध लागू करेगी; अनुरोध प्राप्त करते समय यह जांचने के लिए जांच करेगा कि क्या एक काहेड टोकन मौजूद है, और यदि ऐसा है तो इसे वापस कर दिया जाएगा, अन्यथा यह 'वास्तविक' एसटीएस को कॉल करेगा, एक नया टोकन पुनः प्राप्त करेगा, इसे कैश करेगा और इसे वापस करेगा। क्लाइंट ऐप तब भी ws2007FederationHttp बाइंडिंग का उपयोग कर सकता है, लेकिन जारीकर्ता के रूप में एसटीएस रखने के बजाय स्थानीय कैश होगा;

इस तरह से मुझे लगता है कि हम दोनों दुनिया के सर्वश्रेष्ठ प्राप्त कर सकते हैं - सेवा-विशिष्ट कस्टम कोड के बिना टोकन की कैशिंग; हमारे कैश सभी आरपी के लिए टोकन को संभालने में सक्षम होना चाहिए।

मैं एक बहुत ही सरल प्रोटोटाइप बनाया है, तो यह काम करता है देखने के लिए, और - दुर्भाग्य से कुछ आश्चर्य की बात नहीं - मैं थोड़ा अटक रहा हूँ - पहली बार -

मेरे स्थानीय सेवा (वर्तमान में एक सांत्वना अनुप्रयोग) अनुरोध हो जाता है, और चारों ओर - टोकन को पुनः प्राप्त करने के लिए एसटीएस को कॉल करता है, इसे कैश करता है और सफलतापूर्वक क्लाइंट को देता है जो बाद में, आरपी को कॉल करने के लिए इसका उपयोग करता है। सभी अच्छी तरह से काम करता है।

दूसरा समय के आसपास है, तथापि, अपने स्थानीय cahce सेवा उसी टोकन को फिर उपयोग करने के लिए कोशिश करता है, लेकिन ग्राहक के पक्ष एक MessageSecurityException के साथ विफल -।

"सुरक्षा प्रोसेसर संदेश में एक सुरक्षा शीर्ष लेख खोजने में असमर्थ था यह हो सकता है क्योंकि संदेश एक असुरक्षित गलती है या क्योंकि संचार पक्षों के बीच बाध्यकारी विसंगति है। यह तब हो सकता है जब सेवा सुरक्षा के लिए कॉन्फ़िगर की गई हो और ग्राहक सुरक्षा का उपयोग नहीं कर रहा है। "

क्या एक ही टोकन को एक से अधिक बार उपयोग करने से रोक रहा है? मुझे संदेह है क्योंकि जब मैंने WSTrustClient नमूना के अनुसार टोकन का पुन: उपयोग किया था तो यह अच्छी तरह से काम करता था; मैं क्या खो रहा हूँ? क्या मेरा विचार संभव है? एक अच्छी पहल?

यहाँ (, बहुत ही बुनियादी इस स्तर पर) है स्थानीय कैश का मुख्य कोड बिट्स - मंच मुझे कोई अब एहसास मैं नहीं छूटा है पर डोमिनिक बेयर के लिए

static LocalTokenCache.STS.Trust13IssueResponse cachedResponse = null; 
    public LocalTokenCache.STS.Trust13IssueResponse Trust13Issue(LocalTokenCache.STS.Trust13IssueRequest request) 
    { 
     if (TokenCache.cachedResponse == null) 
     { 
      Console.WriteLine("cached token not found, calling STS"); 
      //create proxy for real STS 
      STS.WSTrust13SyncClient sts = new LocalTokenCache.STS.WSTrust13SyncClient(); 
      //set credentials for sts 
      sts.ClientCredentials.UserName.UserName = "Yossi"; 
      sts.ClientCredentials.UserName.Password = "[email protected]"; 
      //call issue on real sts 
      STS.RequestSecurityTokenResponseCollectionType stsResponse = sts.Trust13Issue(request.RequestSecurityToken); 
      //create result object - this is a container type for the response returned and is what we need to return; 
      TokenCache.cachedResponse = new LocalTokenCache.STS.Trust13IssueResponse(); 
      //assign sts response to return value... 
      TokenCache.cachedResponse.RequestSecurityTokenResponseCollection = stsResponse; 
     } 
     else 
     { 
     } 
     //...and reutn 
     return TokenCache.cachedResponse; 

उत्तर

6

यह लगभग शर्मनाक है लेकिन धन्यवाद एक विशाल बिंदु (मुझे पता था कि यह समझ में नहीं आया! ईमानदारी से! :-)) -

एक टोकन प्रति सेवा प्रॉक्सी में एक बार पुनर्प्राप्त हो जाता है, मानते हैं कि यह समाप्त नहीं हुआ है, और इसलिए मुझे बस इतना करना है कि मुझे पुन: उपयोग करना है वही प्रॉक्सी, जिसे मैंने वैसे भी करने की योजना बनाई, लेकिन, बल्कि बेवकूफ, मेरे प्रोटोटाइप पर नहीं था।

इसके अलावा - Durable Issued Token Provider है, जो, अगर मैं इसे सही ढंग से समझ, क्लाइंट पक्ष पर एक कस्टम endpoint व्यवहार का उपयोग करता टोकन कैशिंग है, जो बहुत ही सुंदर है लागू करने के लिए - मैं MSDN WCF नमूनों पर एक बहुत ही दिलचस्प नमूना पाया।

मैं अभी भी इस दृष्टिकोण को देखूंगा क्योंकि हमारे पास कई सेवाएं हैं और इसलिए हम अपने प्रॉक्सी के बीच एक ही टोकन का पुन: उपयोग करके और भी अधिक दक्षता प्राप्त कर सकते हैं।

तो - दो समाधान, मेरी आंखों का बहुत अधिक infornt; आशा है कि मेरी मूर्खता किसी को किसी बिंदु पर मदद करेगी!

+0

यहाँ कुछ नहीं बेवकूफ है - अगर एक है कि खाई में गिर जाता है तो अधिक हो जाएगा। ऊपर आपको सवाल पर जवाब दिया और वास्तव में इस पर वापस आने का जवाब दिया। हाँ तुम्हारे लिए –

+0

इसी तरह - विश्वास करें या एक समान परिदृश्य को हिट न करें। वापस आने के लिए अच्छा है – Sentinel

संबंधित मुद्दे