إنشاء مخبأ الرمز المميز المحلي باستخدام الإطار جنيف

StackOverflow https://stackoverflow.com/questions/400246

سؤال

ولم أر الكثير من التساؤلات المتعلقة جنيف بعد، لقد نشرت هذه المسألة في في منتدى جنيف كذلك ...

وأنا أعمل على هذا السيناريو حيث لدينا التطبيق أشكال الفوز مع installbase واسعة، والتي سيتم إصدار دعوات متكررة إلى مختلف الخدمات التي استضافتها لنا مركزيا في جميع أنحاء انها العملية.

والخدمات كلها باستخدام إطار جنيف، ومن المتوقع أن الكلمة أولا أن يصدر مع رمز لدينا STS للسماح بالوصول إلى كافة الخدمات للعملاء.

ومن خارج منطقة الجزاء، وذلك باستخدام ws2007FederationHttpBinding، يمكن تكوين التطبيق لاسترداد رمز من STS قبل كل مكالمة خدمة، ولكن من الواضح أن هذا ليس هو الطريقة الأكثر فعالية كما أننا تكرار ما يقرب من جهد من استدعاء الخدمات .

وبدلا من ذلك، لقد نفذت التعليمات البرمجية اللازمة لاسترداد رمز "يدويا" من التطبيق، ومن ثم تمرير نفس المنوال قبل استرجاعها عند استدعاء العمليات على خدمات (استنادا إلى عينة WSTrustClient وhelpon المنتدى)؛ التي تعمل بشكل جيد وذلك لدينا حل، ولكن أنا يصدقها الناس ليست أنيقة جدا لأنه يتطلب بناء قناة WCF في التعليمات البرمجية، والابتعاد عن تكوين WCF رائع.

وأنا أفضل بكثير النهج ws2007FederationHttpBinding حيث قبل العميل ببساطة يدعو خدمة مثل أي خدمة WCF أخرى، من دون معرفة أي شيء عن جنيف، والارتباطات يعتني تبادل رمزي.

وبعد ذلك شخص (جون سيمبسون) أعطاني [ما اعتقد هو] فكرة عظيمة - إضافة خدمة، استضافت في التطبيق نفسه لتخزين الرموز التي تم استردادها محليا. ان خدمة التخزين المؤقت المحلية تنفيذ العقد نفسه باسم STS. عندما نال طلب ذلك من شأنه أن تحقق لمعرفة ما إذا كان يوجد رمز cahced، وإذا كان الأمر كذلك سيعود، وإلا فإنه سيدعو إلى STS "الحقيقية"، retrive رمز مميز جديد، مخبأ به وإعادته. التطبيق العميل يمكن بعد ذلك لا تزال تستخدم ws2007FederationHttpBinding، ولكن بدلا من وجود STS باعتبارها المصدر أنه سيكون لديك ذاكرة التخزين المؤقت المحلية؛

وبهذه الطريقة أعتقد أننا نستطيع تحقيق الأفضل من كلا العالمين - التخزين المؤقت من الرموز دون تعليمات برمجية مخصصة الخدمة sepcific. وينبغي أن يكون مخبأ لدينا قادرة على التعامل مع الرموز لجميع RPS.

ولقد خلق نموذج بسيط جدا لمعرفة ما إذا كان يعمل، و- إلى حد ما ليس من المستغرب للأسف - وأنا عالقة قليلا -

وخدمة بلدي المحلية (حاليا التطبيق وحدة) يحصل على الطلب، و- المرة الأولى - يدعو STS لاسترداد رمز، وتخزين ذلك وبنجاح ترجع إلى العميل الذي، في وقت لاحق، فإنه يستخدم لاستدعاء RP. كل يعمل بشكل جيد.

والمرة الثانية، ومع ذلك، تحاول خدمة بلدي 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 = "p@ssw0rd"; 
            //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;
هل كانت مفيدة؟

المحلول

وهذا أمر محرج تقريبا، ولكن بفضل دومينيك باير في المنتدى أنا لا أدرك الآن لقد غاب نقطة ضخمة (أنا أعرف أنه لا معنى بصراحة :-)!) -

ويحصل على استرجاع رمز مميز مرة واحدة في كيل خدمة، على افتراض أنها لم تنته، وهكذا كل ما يلزم القيام به هو إعادة استخدام نفس الوكيل، وهو ما تعتزم القيام به على أي حال، بل بغباء، لا على بلدي النموذج المبدئي.

وبالإضافة إلى ذلك - وجدت عينة مثيرة جدا للاهتمام على عينات MSDN WCF - <وأ href = "http://msdn.microsoft.com/en-us/library/aa717045(VS.85).aspx" يختلط = "noreferrer نوفولو"> التحمل صدر مزود الرمز المميز ، والتي، إذا فهمت بشكل صحيح، يستخدم السلوك نقطة النهاية المخصصة على جانب العميل لتنفيذ التخزين المؤقت رمزي، الذي هو أنيق جدا.

وسوف لا تزال تبدو في هذا النهج كما لدينا العديد من الخدمات وحتى نتمكن من تحقيق المزيد من الكفاءة من خلال إعادة استخدام نفس المنوال بين عملائهم.

وهكذا - حلين، الى حد كبير infornt عيني. نأمل يا الغباء يساعد شخص ما في وقت ما!

نصائح أخرى

ولقد قدمت عينة كاملة للتخزين المؤقت الرمز المميز هنا: <لأ href = "http://blogs.technet.com/b/meamcs/archive/2011/11/20/caching-sts-security-token -مع-ونشطة على شبكة الانترنت على client.aspx "يختلط =" نوفولو "> http://blogs.technet.com/b/meamcs/archive/2011/11/20/caching-sts-security-token-with -an نشط على شبكة الانترنت على client.aspx

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top