दिलचस्प पोस्ट
मैं कैसे सीपीयू में सीपीयू प्रोग्राम उत्पन्न कर सकता हूँ? एंड्रॉइड कैमरा इन्टेंट एक जावा यूआरएल कनेक्शन के उपयोगकर्ता एजेंट की स्थापना जब तक यह पूरी तरह तैयार नहीं होता है तब तक खिड़की को प्रदर्शित करने से रोकना? OPENROWSET क्वेरी में एक वैरिएबल का उपयोग करना एनवीडिया के एनवीसीसी कंपाइलर में कई "आर्क" झंडे का उपयोग करने का उद्देश्य क्या है? कैनवास क्यों करता है .डेटाURL () एक सुरक्षा अपवाद फेंकता है? स्मृति रिसाव क्या है? जावा में X509 प्रमाणपत्र से CN कैसे निकालें? TINYTEXT, टेक्स्ट, MEDIUMTEXT और LONGTEXT अधिकतम संग्रहण आकार चल रहे ऐप से Windows C ++ स्टैक ट्रेस कोणीय 2 बीटा.17: प्रॉपर्टी 'नक्शा' प्रकार 'अवलोकन' पर मौजूद नहीं है। कैसे रोकें / चलायें NSTimer? कैसे एक नया सरणी बनाने के बिना, एक और सरणी के साथ एक मौजूदा जावास्क्रिप्ट सरणी का विस्तार करने के लिए? नोटपैड ++ में सीआरएलएफ खोजें

जब एक ही उपयोगकर्ता आईडी एकाधिक उपकरणों पर लॉग इन करने का प्रयास कर रहा है, तो मैं दूसरे उपकरण पर सत्र को कैसे मारूं?

मैं क्या करना चाहता हूं एक समय में केवल एक डिवाइस में लॉग इन करने में सक्षम होने के लिए उपयोगकर्ता आईडी को सीमित करना है। उदाहरण के लिए, उपयोगकर्ता आईडी "एबीसी" उनके कंप्यूटर में लॉग करता है। उपयोगकर्ता आईडी "एबीसी" अब अपने फोन से लॉग इन करने का प्रयास करता है मुझे क्या करना है, उनके कंप्यूटर पर सत्र को मारना है

Spotify ऐप वास्तव में इस- Spotify केवल एक यूजर आईडी एक समय में एक डिवाइस पर लॉग इन करने की अनुमति देता है।

मैं ASP.NET सदस्यता (SqlMembershipProvider) और प्रपत्र प्रमाणीकरण का उपयोग कर रहा हूँ।

मैंने सत्र के चर के साथ प्रयोग किया है लेकिन मुझे यकीन नहीं है कि यहां से कहां से जाना है

वेब के समाधान से एकत्रित समाधान "जब एक ही उपयोगकर्ता आईडी एकाधिक उपकरणों पर लॉग इन करने का प्रयास कर रहा है, तो मैं दूसरे उपकरण पर सत्र को कैसे मारूं?"

मैं इस के लिए एक बहुत ही बढ़िया समाधान के साथ आया था मैंने क्या किया है जब उपयोगकर्ता "बॉब" अपने पीसी से लॉग इन करते हैं, और फिर एक ही उपयोगकर्ता "बॉब" दूसरे स्थान से लॉग करता है, तो पहले स्थान (उनके पीसी) से लॉग-इन को मार दिया जाएगा, जबकि दूसरे की अनुमति होगी रहने के लिए लॉग-इन करें एक बार उपयोगकर्ता लॉग इन करने के बाद, यह एक कस्टम तालिका में एक रिकॉर्ड डालता है जिसे मैंने "लॉगिन" नामक बनाया था। एक सफल लॉग-इन पर, एक रिकॉर्ड इस तालिका में "UserId, sessionId, और लॉग इनइन" के लिए मूल्य के साथ डाला जाएगा। UserId बहुत आत्म-व्याख्यात्मक है, सत्र आयडी वर्तमान सत्र आईडी है (नीचे बताया गया है कि कैसे समझा गया है), और लॉग इन केवल एक बूलियन है जो कि शुरू में एक सफल उपयोगकर्ता लॉग-इन पर सही पर सेट है। मैं उपयोगकर्ता के सफल सत्यापन पर अपने खाता नियंत्रक की मेरी लॉगिन विधि के अंदर "डालें" तर्क को नीचे देखता हूं- नीचे देखें:

Logins login = new Logins(); login.UserId = model.UserName; login.SessionId = System.Web.HttpContext.Current.Session.SessionID;; login.LoggedIn = true; LoginsRepository repo = new LoginsRepository(); repo.InsertOrUpdate(login); repo.Save(); 

मेरी स्थिति के लिए, मैं अपने सभी नियंत्रकों पर जांच करना चाहता हूं कि यह देखने के लिए कि वर्तमान में लॉग इन किए गए उपयोगकर्ता कहीं और में लॉग ऑन हैं, और यदि ऐसा है, तो दूसरे सत्र (एस) को मार डालें फिर, जब मारे गए सत्र कहीं भी नेविगेट करने की कोशिश करता है तो मैं इन चेक को इन पर रखता हूं, ये उन्हें लॉग आउट कर देगा और उन्हें लॉग-इन स्क्रीन पर रीडायरेक्ट कर देगा।

मेरे पास तीन मुख्य विधियां हैं जो ये चेक करती हैं:

 IsYourLoginStillTrue(UserId, SessionId); IsUserLoggedOnElsewhere(UserId, SessionId); LogEveryoneElseOut(UserId, SessionId); 

सेशन आईडी को सत्र में सहेजें ["…"]

इस सब से पहले, हालांकि, सत्र ( [HttpPost] ) विधि के अंदर, सत्र नियंत्रक, सत्र नियंत्रक को सत्र नियंत्रक के पास बचाता है:

 if (Membership.ValidateUser(model.UserName, model.Password)) { Session["sessionid"] = System.Web.HttpContext.Current.Session.SessionID; ... 

नियंत्रक कोड

मैं तो इन तीन विधियों के निष्पादन के प्रवाह को नियंत्रित करने के लिए अपने नियंत्रकों के अंदर तर्क लगाता हूं। नीचे दिये गये नोटिस यदि किसी कारण से Session["sessionid"] null , तो यह केवल "रिक्त" का मान निर्दिष्ट करेगा। यह किसी न किसी रूप में वापस आने पर किसी कारण के लिए ऐसा होता है:

 public ActionResult Index() { if (Session["sessionid"] == null) Session["sessionid"] = "empty"; // check to see if your ID in the Logins table has LoggedIn = true - if so, continue, otherwise, redirect to Login page. if (OperationContext.IsYourLoginStillTrue(System.Web.HttpContext.Current.User.Identity.Name, Session["sessionid"].ToString())) { // check to see if your user ID is being used elsewhere under a different session ID if (!OperationContext.IsUserLoggedOnElsewhere(System.Web.HttpContext.Current.User.Identity.Name, Session["sessionid"].ToString())) { return View(); } else { // if it is being used elsewhere, update all their Logins records to LoggedIn = false, except for your session ID OperationContext.LogEveryoneElseOut(System.Web.HttpContext.Current.User.Identity.Name, Session["sessionid"].ToString()); return View(); } } else { FormsAuthentication.SignOut(); return RedirectToAction("Login", "Account"); } } 

तीन तरीकों

यह मैं देख रहा हूँ कि क्या आप अभी भी लॉग इन हैं (यानी सुनिश्चित करें कि आप किसी अन्य प्रवेश-प्रक्रिया प्रयास से नहीं निकाल दिए गए हैं) यह देखने के लिए उपयोग करने वाले तरीके हैं, और यदि ऐसा है, तो यह देखने के लिए जांचें कि क्या आपका उपयोगकर्ता आईडी कहीं और में लॉग इन है , और यदि हां, तो लॉग इन तालिका में false को अपनी लॉग इन की स्थिति को बस सेट करके उन्हें निकाल दें

 public static bool IsYourLoginStillTrue(string userId, string sid) { CapWorxQuikCapContext context = new CapWorxQuikCapContext(); IEnumerable<Logins> logins = (from i in context.Logins where i.LoggedIn == true && i.UserId == userId && i.SessionId == sid select i).AsEnumerable(); return logins.Any(); } public static bool IsUserLoggedOnElsewhere(string userId, string sid) { CapWorxQuikCapContext context = new CapWorxQuikCapContext(); IEnumerable<Logins> logins = (from i in context.Logins where i.LoggedIn == true && i.UserId == userId && i.SessionId != sid select i).AsEnumerable(); return logins.Any(); } public static void LogEveryoneElseOut(string userId, string sid) { CapWorxQuikCapContext context = new CapWorxQuikCapContext(); IEnumerable<Logins> logins = (from i in context.Logins where i.LoggedIn == true && i.UserId == userId && i.SessionId != sid // need to filter by user ID select i).AsEnumerable(); foreach (Logins item in logins) { item.LoggedIn = false; } context.SaveChanges(); } 

संपादित करें मैं सिर्फ यह भी जोड़ना चाहता हूं कि यह कोड "मुझे याद रखें" सुविधा की क्षमता पर ध्यान नहीं देता मेरी आवश्यकता में इस सुविधा को शामिल नहीं किया गया (वास्तव में, मेरा ग्राहक सुरक्षा कारणों से इसका उपयोग नहीं करना चाहता था) इसलिए मैंने उसे छोड़ दिया। हालांकि कुछ अतिरिक्त कोडिंग के साथ, मुझे पूरा यकीन है कि इसे ध्यान में रखा जा सकता है।

आपको उस जानकारी को संग्रहीत करना होगा जो किसी ने डेटाबेस में प्रवेश किया है। यह आपको यह सत्यापित करने की अनुमति देगा कि उपयोगकर्ता के पास पहले से मौजूद सत्र है। बॉक्स में से ASP.NET में फ़ॉर्म प्रमाणन मॉड्यूल कुकीज़ के साथ काम करता है और आपको सर्वर पर यह जानने का कोई तरीका नहीं है कि उपयोगकर्ता के पास अन्य डिवाइस पर कुकीज़ है, बशर्ते आप सर्वर पर इस जानकारी को संग्रहीत न करें।

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

आप संभवत: एक आधार नियंत्रक बनाना चाहते हैं जो कि यह ऑनऑस्ट्रिनाइजेशन या ऑनएक्शन एक्सपीएसिंग विधियों में करता है। एक और विकल्प अपना स्वयं का प्राधिकरण फ़िल्टर बनाना होगा (मैं खुद को पसंद करता हूं, वास्तव में, क्योंकि मुझे इस तरह की सामान्य आधार कक्षाएं पसंद नहीं हैं)।

इस पद्धति में आप डेटाबेस एक्सेस कर सकते हैं और सत्र आईडी जांच सकते हैं।

ध्यान रखें कि वह निर्विवाद नहीं है। यह किसी के लिए सत्र की कुकी की प्रतिलिपि बनाना और इसके आसपास प्राप्त करना संभव है, हालांकि यह काफी अस्पष्ट है कि ज्यादातर लोगों को शायद यह नहीं पता कि यह कैसे करना है, और यह काफी परेशान है कि जो लोग ऐसा करते हैं वे परेशान नहीं करेंगे।

आप आईपी पते का उपयोग भी कर सकते हैं, लेकिन यह वही सौदा है। प्रॉक्सी या नेट फ़ायरवॉल के पीछे दो लोग समान उपयोगकर्ता होंगे।

मैं कहना चाहता हूं कि सत्र ["सत्रआईडी"] = "कुछ भी" सेट करने का मुख्य कारण यह है कि जब तक आप वास्तव में सत्र वस्तु में कुछ असाइन नहीं करते हैं, सत्र आईडी प्रत्येक अनुरोध पर बदलते रहते हुए लगता है।

मैं कुछ अलग परीक्षण सॉफ्टवेयर लिखने के साथ इस में भाग गया।

यहां एक ऐसा तरीका है जो स्वीकृत उत्तर की तुलना में थोड़ा सरल होता है।

 public static class SessionManager { private static List<User> _sessions = new List<User>(); public static void RegisterLogin(User user) { if (user != null) { _sessions.RemoveAll(u => u.UserName == user.UserName); _sessions.Add(user); } } public static void DeregisterLogin(User user) { if (user != null) _sessions.RemoveAll(u => u.UserName == user.UserName && u.SessionId == user.SessionId); } public static bool ValidateCurrentLogin(User user) { return user != null && _sessions.Any(u => u.UserName == user.UserName && u.SessionId == user.SessionId); } } public class User { public string UserName { get; set; } public string SessionId { get; set; } } 

इसके साथ, उपयोगकर्ता के सत्यापन के बाद अपनी लॉगिन प्रक्रिया के दौरान, आप उपयोगकर्ता वर्ग का एक उदाहरण बनाते हैं और उसे उपयोगकर्ता नाम और सत्र आईडी देते हैं, इसे एक सत्र ऑब्जेक्ट के रूप में सहेजें, फिर इसके साथ रजिस्टर लॉगिन फ़ंक्शन को कॉल करें।

फिर, प्रत्येक पेज लोड पर, आपको सत्र ऑब्जेक्ट प्राप्त होता है और इसे वैध कॉरेंट लॉगिन फ़ंक्शन पर पास किया जाता है।

DeregisterLogin फ़ंक्शन कड़ाई से आवश्यक नहीं है, लेकिन _sessions ऑब्जेक्ट को यथासंभव छोटा रखता है।