2008-11-10 16 views
6

पर कॉल करते समय खाली HttpContext मैंने हाल ही में सिल्वरलाइट के साथ उपयोग करने के लिए एक webservice लिखा है जो ASP.net सदस्यता और भूमिकाओं का उपयोग करता है।WCF webservice

सेवा मैं HTTPContext.Current.User पर देखने में ग्राहक प्रमाणित करने के लिए

हालांकि (जब सेवा सिल्वरलाइट से कहा जाता है कौन सा काम करता है), मैं एक एएसपी से एक ही सेवा को कॉल करने की कोशिश कर रहा है .NET पोस्टबैक। लेकिन जब मैं सेवा के माध्यम से कदम करता हूं HTTPContext.Current उपयोगकर्ता नाम के लिए एक एम्प्ली स्ट्रिंग है।

मुझे लगता है कि मैं ऐसा कुछ कर रहा हूं जो मैं web.config फ़ाइल में नहीं कर रहा हूं जो httpContext को मेरी सेवा में प्रॉक्सी के माध्यम से नहीं भेजा जा रहा है?

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

+0

क्या आप एएसपी.NET कॉल कहां से आ रहे हैं, इसके बारे में कुछ और बता सकते हैं? क्या यह सेवा के समान संदर्भ में है? क्या आप उन्हें सेवा मारने से पहले साइट पर लॉग इन करने के लिए मजबूर कर रहे हैं? – Bryant

+0

वे साइट पर लॉग इन करते हैं (हालांकि वे लॉग इन किए बिना ब्राउज़ कर सकते हैं) मैं पोस्टबैक के दौरान सेवा को कॉल करता हूं। मैं पोस्टबैक में HttpContext को देख सकता हूं जो लॉग इन उपयोगकर्ता के साथ पॉप्युलेट किया गया है। लेकिन सेवा पक्ष पर HttpContext खाली है। – JSmyth

+0

मुझे बिल्कुल पता नहीं है कि आप एक ही संदर्भ से क्या मतलब रखते हैं, यदि सेवा का मतलब है तो सेवा को एप्लिकेशन के लिए एक अलग जगह पर होस्ट किया जा रहा है। – JSmyth

उत्तर

0

यह सुनिश्चित नहीं है कि यह सिल्वरलाइट से कैसे काम कर रहा है लेकिन एएसपी.Net नहीं, लेकिन शुरुआत के लिए यहां एक अच्छा blog post on how to setup WCF to work with ASP.Net membership providers है। कुछ कदम हैं इसलिए सेटिंग को याद करना बहुत आसान हो सकता है।

एक बार जब आप सही तरीके से काम कर लें तो मुझे लगता है कि दोनों को सही ढंग से काम करना चाहिए।

0

मुझे लगता है कि ऐसा इसलिए हो सकता है क्योंकि मेरी डब्ल्यूसीएफ सेवा मेरी silverlight.web प्रोजेक्ट में है, और शायद साझा करने की बात आने पर वे अधिक दोस्ताना हैं।

मुझे डब्ल्यूसीएफ पर और अधिक पढ़ने की आवश्यकता हो सकती है और एक अलग webservice प्रोजेक्ट स्थापित करके चिंताओं का अधिक से अधिक पृथक्करण करना पड़ सकता है?

1
इसके बजाय HttpContext की ServiceSecurityContext.Current.PrimaryIdentity कोशिश

+0

ServiceSecurityContext शून्य है - हालांकि मेरे पास <सुरक्षा मोड = "कोई नहीं" /> सेवा के लिए, शायद मुझे प्रमाणपत्र या कुछ सेट अप करना होगा? – JSmyth

0

अद्यतन:

ठीक है मैं फ़िडलर

का उपयोग कर HTTP पोस्ट अनुरोध पर एक नज़र लिया है सिल्वरलाइट अनुप्रयोग की तरह लग रहा एक भेजने 'है एक प्राधिकरण कुकी और मेरा एएसपीनेट ऐप के साथ राज्य 'नहीं है।

ऐसा लगता है कि जब मैं सेवा कहता हूं तो मुझे राज्य + मेरी प्राधिकरण कुकी भेजने की आवश्यकता होती है। मुझे जल्द ही एक नया प्रश्न तैयार करने की आवश्यकता हो सकती है ...

2

मैंने इसे हल कर लिया है!

डिफ़ॉल्ट रूप से लगता है कि सिल्वरलाइट एप्लिकेशन सेवा के लिए सभी ब्राउज़रों कुकीज़ भेज रहा था। इन कुकीज़ में से एक सदस्यता और भूमिकाओं के खिलाफ प्रमाणीकृत करने के लिए ".ASPXAUTH" कुकी है।

एएसपीनेट एप्लिकेशन हालांकि सेवा में कुकीज़ नहीं भेज रहा था। प्राधिकरण कुकी भेजने के लिए मैंने अपनी webservice विधि को कॉल करने से पहले निम्नलिखित कोड का उपयोग किया।

using (OperationContextScope scope = new OperationContextScope(ws.InnerChannel)) 
    { 
HttpRequestMessageProperty httpRequest = new HttpRequestMessageProperty(); 
OperationContext.Current.OutgoingMessageProperties.Add(HttpRequestMessageProperty.Name, httpRequest); 

      HttpCookieCollection cc = Page.Request.Cookies; 
      if (Request.Cookies[".ASPXAUTH"] != null) 
      { 
       HttpCookie aCookie = Request.Cookies[".ASPXAUTH"]; 
       String authcookieValue = Server.HtmlEncode(aCookie.Value); 
       httpRequest.Headers.Add("Cookie: " + ".ASPXAUTH=" + authcookieValue); 

      } 
// Webservice call goes here 
    }