5

मैं एंटिटी फ्रेमवर्क 4 के साथ एक एएसपी.NET एमवीसी 3 वेब अनुप्रयोग विकसित कर रहा हूं। जब कोई उपयोगकर्ता मेरे एप्लिकेशन में लॉग इन करता है तो मैं अपनी उपयोगकर्ता इकाई (फर्स्टनाम, अंतिम नाम इत्यादि) को स्टोर करना चाहता हूं एक सत्र जिसे पूरे एप्लिकेशन में एक्सेस किया जा सकता है।एएसपी.NET एमवीसी स्टोर सत्र में उपयोगकर्ता इकाई

मैं समझता हूं कि यह एक अच्छा विचार नहीं हो सकता है क्योंकि जब ऑब्जेक्ट कॉन्टेक्स्ट बंद/डिस्पोजेक्ट करता है, तो उपयोगकर्ता इकाई अलग हो जाती है और उपयोगकर्ता का विवरण खो सकता है।

मैंने सोचा था कि एक और तरीका, हो सकता है जब उपयोगकर्ता में लॉग करता है, एक सत्र चर को userID (प्राथमिक कुंजी) आवंटित अर्थात्:

HttpContext.Current.Session["currentUserID"] = user.userID; 

फिर तो जैसे UserService कक्षा में एक वर्ग बनाने के लिए:

public static User CurrentUser 
    { 

     get 
     { 
      return Data.DBEntities.Users.Where(u => u.userID == HttpContext.Current.Session["currentUserID"]).FirstOrDefault(); 
     } 

    } 

वर्तमान उपयोगकर्ता आईडी सत्र के आधार पर उपयोगकर्ता इकाई को वापस करना चाहिए। यह मेरे लिए काम कर रहा है लेकिन नहीं, मैं त्रुटियों

Cannot convert lambda expression to type 'string' because it is not a delegate type 
Delegate 'System.Func<Asset.Model.User,int,bool>' does not take 1 arguments 

की एक जोड़ी है इस दृष्टिकोण मैं सही ले रहा हूँ हो रही है, या वहाँ एक बेहतर तरीका है?

कोई भी प्रतिक्रिया बहुत सराहना की जाएगी।

उत्तर

9

सबसे पहले, Session में सुरक्षा-संवेदनशील जानकारी संग्रहीत न करें। क्यों जानकारी के लिए Google "एएसपी.NET सत्र अपहरण"।

उस ने कहा, यह कोड काम करने के लिए बनाया जा सकता है। आपके पास सिर्फ एक कास्ट त्रुटि है। साथ ही, आप इस तथ्य के लिए लेखांकन नहीं कर रहे हैं कि Session कर सकते हैं और लॉगिन के दौरान समाप्त हो जाता है। आप यह कर सकते हैं:

public static User CurrentUser 
{ 
    get 
    { 
     object userID = HttpContext.Current.Session["currentUserID"]; 
     if (userID == null) 
     { 
      throw new InvalidOperationException("Oops!"); 
     } 
     return Data.DBEntities.Users.Where(u => u.userID == (int)userId).FirstOrDefault(); 
    } 
} 

... जो कम से कम संकलित करता है, लेकिन सुरक्षित नहीं होता है और कभी-कभी फेंकता है।

उपयोगकर्ता आईडी को custom principal पर संग्रहीत करना बेहतर होगा, जो सुरक्षित है और समाप्त नहीं होता है।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। – tgriffiths

0

आप सत्र में पूरी इकाई को स्टोर कर सकते हैं। यह अलग हो जाएगा लेकिन इसका मतलब यह नहीं है कि यह मूल्य खो जाएगा - केवल आलसी लोडिंग के मामले में आप आलसी लोड नेविगेशन गुणों में सक्षम नहीं होंगे।

अपने वर्तमान कोड में अपने currentUserId को अस्थायी चर के लिए प्राप्त करने का प्रयास करें और अपनी क्वेरी में उस चर का उपयोग करें।

+1

मेरे उत्तर में पहले से उल्लिखित दो समस्याओं के अलावा, यह अतिरिक्त जोखिम पेश करता है कि आपका ऐप रनटाइम पर असफल हो सकता है यदि आप (1) एक वितरित सत्र स्टोर पर स्विच करते हैं और (2) में कोई गैर-धारावाहिक गुण होते हैं। उस ने कहा, मुझे लगता है कि "असुरक्षित और अविश्वसनीय" पर्याप्त कारणों से बिना 'सत्र' में इसे न रखने के कारण हैं। 'सत्र' उपयोगकर्ता-विशिष्ट कैश है, न कि सामान्य उद्देश्य, सुरक्षित डेटा स्टोर। –

+0

@ क्रेग: अच्छे अंक। –

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

  • कोई संबंधित समस्या नहीं^_^