2012-06-28 14 views
9

हमारे पास क्लासिक एएसपी में एक वेबसाइट है जिसे हम धीरे-धीरे ASP.NET में माइग्रेट कर रहे हैं।एएसपी.NET सत्र चर के लिए एएसपी

पाठ्यक्रम की समस्या यह है कि कैसे क्लासिक एएसपी और एएसपी.नेट हैंडल सत्र। वेब पर शोध करने के आखिरी कुछ घंटों खर्च करने के बाद, मुझे कई लेख मिल गए, लेकिन दूसरों पर खड़ा नहीं था।

क्या क्लास एएसपी और एएसपीनेट से सत्र चर को स्थानांतरित करने के लिए कोई सर्वोत्तम अभ्यास है? सुरक्षा जरूरी है और उदाहरणों के साथ कोई स्पष्टीकरण बहुत सराहना की है।

+0

मुझे इस सप्ताह के अंत तक एक समाधान के साथ किया जाना चाहिए जो हमारी आवश्यकताओं के अनुरूप सर्वोत्तम है। मैं कुछ अन्य तरीकों का भी उल्लेख करूंगा। पोस्ट रहो। – PsychoDUCK

उत्तर

5

एक साधारण पुल (ग्राहक से अपने sessionvalue छुपा) .net serverside करने के लिए क्लासिक एएसपी से एक ही सत्र चर पारित करने के लिए, इस होगा:

  • एएसपी अंत में: उत्पादन के लिए एक एएसपी पेज आपका सत्र, इसे कॉल करें उदा asp2netbridge.asp

    <% 
    'Make sure it can be only called from local server ' 
    if (request.servervariables("LOCAL_ADDR") = request.servervariables("REMOTE_ADDR")) then 
        if (Request.QueryString("sessVar") <> "") then 
         response.write Session(Request.QueryString("sessVar")) 
        end if 
    end if 
    %> 
    
  • .net छोर पर, कि एएसपी पृष्ठ पर एक दूरस्थ कॉल।:

    private static string GetAspSession(string sessionValue) 
    { 
        HttpWebRequest _myRequest = (HttpWebRequest)WebRequest.Create(new Uri("http://yourdomain.com/asp2netbridge.asp?sessVar=" + sessionValue)); 
        _myRequest.ContentType = "text/html"; 
        _myRequest.Credentials = CredentialCache.DefaultCredentials; 
        if (_myRequest.CookieContainer == null) 
         _myRequest.CookieContainer = new CookieContainer(); 
        foreach (string cookieKey in HttpContext.Current.Request.Cookies.Keys) 
        { 
         ' it is absolutely necessary to pass the ASPSESSIONID cookie or you will start a new session ! ' 
         if (cookieKey.StartsWith("ASPSESSIONID")) { 
          HttpCookie cookie = HttpContext.Current.Request.Cookies[cookieKey.ToString()]; 
          _myRequest.CookieContainer.Add(new Cookie(cookie.Name, cookie.Value, cookie.Path, string.IsNullOrEmpty(cookie.Domain) 
           ? HttpContext.Current.Request.Url.Host 
           : cookie.Domain)); 
         } 
        } 
        try 
        { 
         HttpWebResponse _myWebResponse = (HttpWebResponse)_myRequest.GetResponse(); 
    
         StreamReader sr = new StreamReader(_myWebResponse.GetResponseStream()); 
         return sr.ReadToEnd(); 
        } 
        catch (WebException we) 
        { 
         return we.Message; 
        } 
    } 
    
+0

Thats कैसे मैं इसे कोडिंग समाप्त हो गया। मैं अपना जवाब पोस्ट करना भूल गया। – PsychoDUCK

+0

सत्रवैल्यू मूल्य यहाँ क्या है? – Sajeetharan

+0

@Sajeetharan यह सुनिश्चित नहीं है कि आपका प्रश्न क्या है .. sessionValue कोई भी सत्र चर है जिसे आप साझा करना चाहते हैं, इसलिए कोई स्ट्रिंग पैरामीटर – AardVark71

0

वे विभिन्न सत्रों का उपयोग करते हैं, इसलिए आपको स्वयं को वार्स को स्थानांतरित करने का कोई तरीका तैयार करना होगा। आप उन्हें कुकीज़ में शामिल कर सकते हैं, या उन्हें HTTP POST (यानी छुपा फ़ील्ड वाले एक फॉर्म) के माध्यम से asp.net पक्ष में भेज सकते हैं।

वैकल्पिक रूप से, आप सत्र संग्रहण का उपयोग करके स्क्रैप कर सकते हैं और प्रत्येक उपयोगकर्ता/सत्र के लिए डेटाबेस में सब कुछ छड़ी कर सकते हैं, फिर क्लासिक एएसपी से ASP.NET तक उपरोक्त सुझावों में से एक के माध्यम से बस एक सत्र कुंजी पास करें। मुझे पता है जैसे आप पहिया को फिर से शुरू कर रहे हैं, लेकिन यह उन मामलों में से एक हो सकता है जहां आप इसके आसपास नहीं जा सकते हैं।

+0

मैं इस पोस्ट को सभी समाधानों पर विचार करने और सुरक्षा को ध्यान में रखते हुए 'सर्वश्रेष्ठ' समाधान निर्धारित करने या बनाने के लिए चाहूंगा। एक दूसरे के बाद बेहतर क्यों है। स्पष्ट रूप से कुछ परिदृश्यों पर आधारित एक दूसरे के बाद बेहतर होगा, लेकिन कोई स्पष्ट उत्तर नहीं है कि मैं वेब पर पा सकता हूं। – PsychoDUCK

+0

इस प्रश्न का कोई निश्चित उत्तर नहीं है, और एक जवाब को "सर्वश्रेष्ठ" लेबल करना असंभव होगा, क्योंकि यह एक बहुत ही व्यक्तिपरक शब्द है। आपको कुछ शोध करना होगा और यह निर्धारित करना होगा कि आपकी आवश्यकताओं के लिए सबसे अच्छा क्या काम करता है। ये केवल कुछ विचार हैं, और आपको अपनी जरूरतों के आधार पर उनका शोध करना चाहिए। –

+0

हालांकि सुरक्षा विचारों के लिए, मैं क्लाइंट को वर्र्स भेजने (कुकी, छिपे हुए फॉर्म फ़ील्ड्स इत्यादि) से बचने से बचूंगा। मेरे दूसरे पैराग्राफ के समान समाधान पर विचार करें, जहां आप आंतरिक रूप से वर्रों को स्टोर करते हैं, और क्लाइंट को पहचानकर्ता भेजते हैं। –

3

मैंने एक अजाक्स पुल (एक बेहतर शब्द की इच्छा के लिए) का उपयोग किया है, विशेष रूप से, एक क्लासिक एएसपी पृष्ठ जो सभी सत्र वर्रों को एक ग्रिड के साथ डेटाबेस में पढ़ता है, फिर यह गिट को पास करने वाले .net पृष्ठ पर रीडायरेक्ट करता है क्वेरीस्ट्रिंग, एएसपीनेट पृष्ठ दिए गए मार्गदर्शिका के लिए एसक्यूएल से पढ़ता है और उन वर्रों को सत्र के रूप में बनाया गया है।

जैसे, क्लासिक एएसपी में (स्यूडोकोड कोड - ठीक वैसे ही जानकारी देने के लिए, तुम्हारा आदि में parameterised प्रश्नों का उपयोग):

'#### Create GUID 
Dim GUID 'as string 
GUID = CreateWindowsGUID() '#### Lots of methods on http://support.microsoft.com/kb/320375 

'#### Save session to sql 
For Each SessionVar In Session.Contents 
    db.execute("INSERT INTO SessionBridge (GUID, Key, Value) VALUES ('" & GUID & "', '" & SessionVar & "', '" & session(SessionVar) & "')") 
Next 

फिर, एक .net पेज में:

'#### Fetch GUID 
Dim GUID as string = Request.QueryString("GUID") 
session.clear 

'#### Fetch from SQL 
db.execute(RS, "SELECT * FROM SessionBridge WHERE GUID = '" & GUID & "'") 
For Each db_row as datarow in RS.rows 
    Session(db_row("Key")) = db_row("Value") 
Next 

जैसा कि मैंने कहा, यह बहुत मोटा छद्म कोड है, लेकिन आप एक साधारण पृष्ठभूमि AJAX फ़ंक्शन के साथ एएसपी को कॉल कर सकते हैं, फिर दिए गए GUID के लिए .net पृष्ठ पर कॉल करें।

इसका लाभ क्लाइंट को आपके सभी वर्रों और मूल्यों को उजागर करने का लाभ नहीं है (पोस्ट विधियों के रूप में आदि)।

+0

यह वही है जो मैंने एक अच्छा समाधान माना था। लेकिन एक माइक्रोसॉफ्ट आलेख के आधार पर उलझन में आया जिसने एक समान दृष्टिकोण किया जिसके लिए सुरक्षा डीएलएल पंजीकृत होना आवश्यक था और आदि। मुझे समझ में नहीं आया कि यह क्यों जरूरी था। यहां http://msdn.microsoft.com/en-us/library/aa479313.aspx लिंक है। कोई विचार क्यों एमएसडीएन लेख में उल्लिखित सभी अतिरिक्त काम है? यदि यह बिल्कुल जरूरी है? – PsychoDUCK

+1

@PsychoDUCK मुझे लगता है कि माइक्रोसॉफ्ट का संस्करण अधिक सामान्य है। आप किसी भी ऑब्जेक्ट को सत्र चर (केवल स्ट्रिंग्स) में स्टोर नहीं कर सकते हैं, इसलिए अनुमान लगाएं कि उनका समाधान उस पर संभाल सकता है। लेकिन अगर आप केवल सत्र चर में स्ट्रिंग स्टोर करते हैं, तो यह ठीक काम करता है (बस सुनिश्चित करें कि सत्र मानों में उद्धरण नहीं हैं या यहां पोस्ट किया गया निर्देश संभवतः तोड़ देगा) – Rodolfo

0

मेरे पास एक ऐसी वेबसाइट है जो सही कार्य करती है। गुप्त response.redirect

<% 
client_id = session("client_id") 
response.redirect "aspx_page.aspx?client_id=" & client_id 
%> 

इस क्लासिक एएसपी सत्र चर client_id खींच और यह एक aspx पृष्ठ पर पारित करने के लिए एक उदाहरण है एएसपी समारोह के साथ एक मध्यवर्ती पृष्ठ का प्रयोग है। आपके एएसपीएक्स पेज को वहां से संसाधित करने की आवश्यकता होगी।

यह क्लासिक एएसपी पृष्ठ के शीर्ष पर होना चाहिए, जिसमें ऊपर दिए गए किसी भी प्रकार का HTML नहीं है। आईआईएस सर्वर पर इस प्रक्रिया को संसाधित करेगा और क्लाइंट मशीन पर डेटा भेजने के बिना संलग्न क्वेरी स्ट्रिंग के साथ एएसपीएक्स पेज पर रीडायरेक्ट करेगा। यह बहुत तेज़ है।

+2

"... क्लाइंट मशीन पर डेटा भेजने के बिना" - Response.Redirect क्लाइंट मशीन पर क्लाइंट_आईडी युक्त यूआरएल भेजता है। – Joe

+0

@joe 'सर्वर। ट्रांसफर' के बजाय यहां काम कर सकता है या क्या मुझे कुछ याद आ रही है? –

0

मामले में किसी और को यहाँ कुछ मदद की तलाश में ठोकर, एक और संभावित विकल्प कुकीज़ का उपयोग करने के लिए है। कुकी का लाभ यह है कि आप उचित मात्रा में डेटा स्टोर कर सकते हैं और फिर उस डेटा को अपने .NET एप्लिकेशन (या किसी अन्य वेब एप्लिकेशन) पर जारी रख सकते हैं। कुकी को उजागर करने के साथ सुरक्षा जोखिम हैं क्योंकि उस डेटा को आसानी से छेड़छाड़ या फिक्र किया जा सकता है। मैं एक कुकी में संवेदनशील डेटा नहीं भेजूंगा। यहां कुकी केवल एक अद्वितीय पहचानकर्ता संग्रहित कर रही है जिसे किसी तालिका से डेटा पुनर्प्राप्त करने के लिए उपयोग किया जा सकता है।

दृष्टिकोण:

  1. ले लो सत्र डेटा आप अपने क्लासिक एएसपी पेज से की जरूरत है। स्टोर को इस तालिका में एक अद्वितीय हैश और टाइमस्टैम्प के साथ स्टोर करें।
  2. एक अल्पकालिक कुकी में हैश का मूल्य स्टोर करें।
  3. कुकीज में हैश पढ़ने और पढ़ने के लिए आपको जो भी पृष्ठ चाहिए उसे रीडायरेक्ट करें।
  4. जांचें कि कुकी में हैश डेटाबेस में समाप्त नहीं हुआ है। यदि यह मान्य है, तो आपको अपने पृष्ठ पर आवश्यक डेटा वापस भेजें और फिर हैश की अवधि समाप्त करें ताकि इसका पुन: उपयोग नहीं किया जा सके।

मैंने एक SHA 256 हैश का उपयोग किया जो उपयोगकर्ता के अद्वितीय पहचानकर्ता, सत्र आईडी और वर्तमान टाइमस्टैम्प का संयोजन था। हैश केवल कुछ ही मिनटों के लिए मान्य है और पढ़ने पर समाप्त हो गया है। विचार एक हमलावर के लिए खिड़की को सीमित करना है जिसे समाप्त होने से पहले वैध हैश अनुमान लगाने की आवश्यकता होगी।

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