2008-09-04 18 views
9

मैं याहू यूआई लाइब्रेरी का हिस्सा याहू अपलोडर का उपयोग कर रहा हूं, जो मेरी एएसपी.Net वेबसाइट पर उपयोगकर्ताओं को फाइल अपलोड करने की अनुमति देता है। उन अपरिचित लोगों के लिए, अपलोडर फ़ाइल ओपन संवाद पर अधिक नियंत्रण देने के लिए एक फ्लैश ऐपलेट का उपयोग करके काम करता है। मैं फ़ाइल प्रकारों के लिए एक फिल्टर, आदि निर्दिष्ट कर सकते हैं एक से अधिक फ़ाइलों की अनुमति देने के चुने जाने की यह बहुत अच्छा है, लेकिन यह निम्न दस्तावेज सीमित है:क्या मैं एक छिपे हुए फॉर्म फ़ील्ड में एएसपी.Net सत्र आईडी डाल सकता हूं?

एक ज्ञात फ्लैश बग की वजह से

, अपलोडर Windows में फ़ायरफ़ॉक्स में चल रहा होता है अपलोड के साथ सही कुकीज़ नहीं भेजें; फ़ायरफ़ॉक्स कुकीज़ भेजने के बजाय, यह संबंधित डोमेन के लिए इंटरनेट एक्सप्लोरर की कुकीज़ भेजता है। एक कामकाज के रूप में, हम या तो एक कुकीज अपलोड विधि का उपयोग या अपलोड अनुरोध में document.cookie संलग्न करने का सुझाव देते हैं।

इसलिए, यदि कोई उपयोगकर्ता फ़ायरफ़ॉक्स का उपयोग कर रहा है, तो मैं फ़ाइल अपलोड करते समय अपने सत्र को जारी रखने के लिए कुकीज़ पर भरोसा नहीं कर सकता। मुझे उनके सत्र की ज़रूरत है क्योंकि मुझे यह जानने की जरूरत है कि वे कौन हैं! समाधान के लिए, मैं आवेदन वस्तु thusly उपयोग कर रहा हूँ:

Guid UploadID = Guid.NewGuid(); 
Application.Add(Guid.ToString(), User); 

तो, मैं एक अद्वितीय ID बना रहा हूं और आवेदन दायरे में Page.User वस्तु स्टोर करने के लिए एक प्रमुख के रूप में उपयोग। जब फ़ाइल अपलोड हो जाती है तो मैं POST में एक चर के रूप में आईडी शामिल करता हूं। फिर, हैंडलर कि फाइल अपलोड स्वीकार करता है में, मैं उपयोगकर्ता वस्तु thusly हड़पने:

IPrincipal User = (IPrincipal)Application[Request.Form["uploadid"]]; 

यह वास्तव में काम करता है, लेकिन यह दो स्पष्ट कमियां भी हैं:

  • आईआईएस तो ऐप्लिकेशन पूल, या यहां तक ​​कि एप्लिकेशन अपलोड पृष्ठ पर आने के समय भी एप्लिकेशन को पुनरारंभ किया जाता है, और वास्तव में एक फ़ाइल अपलोड करता है, उनके "अपलोडिड" को एप्लिकेशन स्कोप से हटा दिया जाता है और अपलोड विफल हो जाता है क्योंकि मैं उन्हें प्रमाणित नहीं कर सकता।

  • अगर मैं कभी भी एक वेब खेत में बड़े पैमाने (संभवतः भी एक वेब उद्यान) परिदृश्य, यह पूरी तरह से टूट जाएगा। मैं चिंतित नहीं हो सकता, सिवाय इसके कि मैं भविष्य में इस ऐप को स्केल करने की योजना बना रहा हूं।

क्या किसी के पास बेहतर तरीका है? क्या POST वैरिएबल में वास्तविक ASP.Net सत्र आईडी को पास करने का कोई तरीका है, फिर सत्र को पुनर्प्राप्त करने के लिए दूसरी तरफ उस आईडी का उपयोग करें?

मैं मैं Session.SessionID के माध्यम से सत्र ID प्राप्त कर सकते हैं, और मैं अगले पृष्ठ पर पोस्ट करने के लिए YUI उपयोग करने के लिए कैसे पता है। मुझे नहीं पता कि राज्य सर्वर से सत्र को पकड़ने के लिए SessionID का उपयोग कैसे करें।

हाँ, मैं एक स्थिति सर्वर का उपयोग कर रहा सत्र स्टोर करने के लिए है, इसलिए वे आवेदन/आईआईएस पुनरारंभ जारी रहती है, और एक वेब खेत परिदृश्य में काम करेंगे।

उत्तर

3

HereSWFUpload के रखरखाव से एक पोस्ट है जो बताता है कि Request.Form में संग्रहीत आईडी से सत्र कैसे लोड किया जाए। मुझे कल्पना है कि वही बात याहू घटक के लिए काम करेगी।

पोस्ट के निचले हिस्से में सुरक्षा अस्वीकरण नोट करें।


एक Global.asax फ़ाइल सहित और निम्नलिखित कोड तुम्हारी याद आ रही सत्र आईडी कुकी ओवरराइड कर सकते हैं द्वारा:

using System; 
using System.Web; 

public class Global_asax : System.Web.HttpApplication 
{ 
    private void Application_BeginRequest(object sender, EventArgs e) 
    { 
     /* 
     Fix for the Flash Player Cookie bug in Non-IE browsers. 
     Since Flash Player always sends the IE cookies even in FireFox 
     we have to bypass the cookies by sending the values as part of the POST or GET 
     and overwrite the cookies with the passed in values. 

     The theory is that at this point (BeginRequest) the cookies have not been ready by 
     the Session and Authentication logic and if we update the cookies here we'll get our 
     Session and Authentication restored correctly 
     */ 

     HttpRequest request = HttpContext.Current.Request; 

     try 
     { 
      string sessionParamName = "ASPSESSID"; 
      string sessionCookieName = "ASP.NET_SESSIONID"; 

      string sessionValue = request.Form[sessionParamName] ?? request.QueryString[sessionParamName]; 
      if (sessionValue != null) 
      { 
       UpdateCookie(sessionCookieName, sessionValue); 
      } 
     } 
     catch (Exception ex) 
     { 
      // TODO: Add logging here. 
     } 

     try 
     { 
      string authParamName = "AUTHID"; 
      string authCookieName = FormsAuthentication.FormsCookieName; 

      string authValue = request.Form[authParamName] ?? request.QueryString[authParamName]; 
      if (authValue != null) 
      { 
       UpdateCookie(authCookieName, authValue); 
      } 
     } 
     catch (Exception ex) 
     { 
      // TODO: Add logging here. 
     } 
    } 

    private void UpdateCookie(string cookieName, string cookieValue) 
    { 
     HttpCookie cookie = HttpContext.Current.Request.Cookies.Get(cookieName); 
     if (cookie == null) 
     { 
      HttpCookie newCookie = new HttpCookie(cookieName, cookieValue); 
      Response.Cookies.Add(newCookie); 
     } 
     else 
     { 
      cookie.Value = cookieValue; 
      HttpContext.Current.Request.Cookies.Set(cookie); 
     } 
    } 
} 

सुरक्षा चेतावनी: बस की नकल न करें और यह कोड जानने के बिना कि आप क्या कर रहे हैं, इस कोड को अपने एएसपी.Net एप्लिकेशन में पेस्ट करें। यह क्रॉस-साइट स्क्रिप्टिंग के सुरक्षा मुद्दों और संभावनाओं को प्रस्तुत करता है।

+0

यह मैं वास्तव में क्या ढूंढ रहा था। धन्यवाद! –

+7

अरे ... लिंक टूटा हुआ प्रतीत होता है .. क्या आप अपडेट कर सकते हैं? – Mulki

+2

हाँ, हमें इसकी आवश्यकता है! कृपया एक नया लिंक प्रदान करें! – pilavdzice

0

ASP.Net सत्र आईडी Session.SessionID में संग्रहीत किया जाता है ताकि आप एक छिपी हुई फ़ील्ड में सेट कर सकते हैं कि और फिर अगले पृष्ठ पर पोस्ट।

मुझे लगता है कि यह है कि यदि आवेदन पुनरारंभ, sessionid यदि आप नहीं store your sessions in sql server कर समाप्त हो जाएगा।

1

आप नीचे दिए गए कोड से अपने वर्तमान SessionID प्राप्त कर सकते हैं:

string sessionId = HttpContext.Current.Session.SessionID; 

तो फिर तुम कि शायद फ़ीड कर सकते हैं एक छिपी हुई फ़ील्ड में और उसके बाद YUI के माध्यम से है कि मूल्य का उपयोग।

यह सिर्फ एक मिलता है, इसलिए आपको उम्मीद है कि कोई स्केलिंग समस्या नहीं होगी। सुरक्षा-समस्याएं हालांकि, मुझे नहीं पता।

1

पर this blog post भरोसा, यहाँ एक समारोह है कि आप सत्र आईडी के आधार पर किसी भी उपयोगकर्ता के लिए सत्र मिलना चाहिए है, यह सुंदर नहीं है, हालांकि:

public SessionStateStoreData GetSessionById(string sessionId) 
{ 
    HttpApplication httpApplication = HttpContext.ApplicationInstance; 

    // Black magiC#1: getting to SessionStateModule 
    HttpModuleCollection httpModuleCollection = httpApplication.Modules; 
    SessionStateModule sessionHttpModule = httpModuleCollection["Session"] as SessionStateModule; 
    if (sessionHttpModule == null) 
    { 
     // Couldn't find Session module 
     return null; 
    } 

    // Black magiC#2: getting to SessionStateStoreProviderBase through reflection 
    FieldInfo fieldInfo = typeof(SessionStateModule).GetField("_store", BindingFlags.NonPublic | BindingFlags.Instance); 
    SessionStateStoreProviderBase sessionStateStoreProviderBase = fieldInfo.GetValue(sessionHttpModule) as SessionStateStoreProviderBase; 
    if (sessionStateStoreProviderBase == null) 
    { 
     // Couldn't find sessionStateStoreProviderBase 
     return null; 
    } 

    // Black magiC#3: generating dummy HttpContext out of the thin air. sessionStateStoreProviderBase.GetItem in #4 needs it. 
    SimpleWorkerRequest request = new SimpleWorkerRequest("dummy.html", null, new StringWriter()); 
    HttpContext context = new HttpContext(request); 

    // Black magiC#4: using sessionStateStoreProviderBase.GetItem to fetch the data from session with given Id. 
    bool locked; 
    TimeSpan lockAge; 
    object lockId; 
    SessionStateActions actions; 
    SessionStateStoreData sessionStateStoreData = sessionStateStoreProviderBase.GetItem(
     context, sessionId, out locked, out lockAge, out lockId, out actions); 
    return sessionStateStoreData; 
} 
+0

बिल्कुल सही शामिल करने का उत्तर! धन्यवाद! – defines