अनुरोधों के बीच ASP.NET पृष्ठ में सत्र -object पर संपत्ति सत्र क्यों चलती है?
मेरे पास इस तरह का एक पेज है:
...
<div>
SessionID: <%= SessionID %>
</div>
...
और हर बार जब मैं F5 हिट करता हूं, तो ब्राउजर से स्वतंत्र होकर आउटपुट बदलता रहता है।
अनुरोधों के बीच ASP.NET पृष्ठ में सत्र -object पर संपत्ति सत्र क्यों चलती है?
मेरे पास इस तरह का एक पेज है:
...
<div>
SessionID: <%= SessionID %>
</div>
...
और हर बार जब मैं F5 हिट करता हूं, तो ब्राउजर से स्वतंत्र होकर आउटपुट बदलता रहता है।
जवाबों:
यही कारण है
कुकी-आधारित सत्र स्थिति का उपयोग करते समय, ASP.NET सत्र डेटा का उपयोग करने तक सत्र डेटा के लिए भंडारण आवंटित नहीं करता है। नतीजतन, सत्र वस्तु तक पहुंचने तक प्रत्येक पृष्ठ अनुरोध के लिए एक नया सत्र आईडी उत्पन्न होता है। यदि आपके आवेदन में पूरे सत्र के लिए एक स्थिर सत्र आईडी की आवश्यकता होती है, तो आप सत्र की ID को ठीक करने के लिए सत्र के ऑब्जेक्ट में Session_Start पद्धति को लागू कर सकते हैं और सत्र आईडी को ठीक करने के लिए सत्र वस्तु में डेटा संग्रहीत कर सकते हैं, या आप अपने किसी अन्य भाग में कोड का उपयोग कर सकते हैं सेशन ऑब्जेक्ट में डेटा को स्पष्ट रूप से स्टोर करने के लिए आवेदन।
http://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.sessionid.aspx
मूल रूप से, जब तक आप बैकएंड पर अपने सत्र ऑब्जेक्ट तक नहीं पहुंचते हैं, तब तक प्रत्येक अनुरोध के साथ एक नया सत्रआईआईडी उत्पन्न हो जाएगा
संपादित करें
यह कोड Global.asax फ़ाइल में जोड़ा जाना चाहिए। यह सत्र ऑब्जेक्ट में एक प्रविष्टि जोड़ता है ताकि आप सत्र समाप्त हो जाए जब तक कि यह समाप्त न हो जाए।
protected void Session_Start(Object sender, EventArgs e)
{
Session["init"] = 0;
}
someid
सत्र असाइन करते हैं तो वही रहेगा। ध्यान रखें कि यह उत्तर 4 साल से अधिक पुराना है, यह सुनिश्चित नहीं है कि इसके संबंध में कोई संशोधन किया गया था या नहीं।
वहाँ एक और, अधिक कपटी कारण है, क्यों यह तब भी हो सकता है जब सत्र ऑब्जेक्ट को Cladudio द्वारा प्रदर्शित किया गया है।
Web.config में, यदि कोई <httpCookies>
प्रविष्टि है जो सेट है, requireSSL="true"
लेकिन आप वास्तव में HTTPS का उपयोग नहीं कर रहे हैं: एक विशिष्ट अनुरोध के लिए, तो सत्र कुकी नहीं भेजी जाती (या शायद वापस नहीं आई, मुझे यकीन नहीं है कि) आप प्रत्येक अनुरोध के लिए एक नया सत्र समाप्त करते हैं।
मुझे यह एक कठिन तरीका लगा, अपने स्रोत नियंत्रण में कई कमिट्स के बीच आगे और पीछे जाने में कई घंटे बिताने तक, जब तक कि मैंने यह नहीं पाया कि मेरे आवेदन में क्या विशिष्ट परिवर्तन हुआ है।
मेरे मामले में मुझे पता चला कि सत्र कुकी में एक डोमेन था जिसमें www.
उपसर्ग शामिल था, जबकि मैं पृष्ठ के साथ अनुरोध कर रहा था www.
। URL में
जोड़कर www.
समस्या को तुरंत ठीक कर दिया गया। बाद में मैंने कुकी के डोमेन को बदल दिया जिसके .mysite.com
बदले सेट किया जाना था www.mysite.com
।
मेरी समस्या यह थी कि हमारे पास web.config में यह सेट था
<httpCookies httpOnlyCookies="true" requireSSL="true" />
इसका मतलब यह है कि जब गैर-एसएसएल (डिफॉल्ट) में डिबगिंग होती है, तो ऑर्टिकल कुकी को सर्वर पर वापस नहीं भेजा जाएगा। इसका मतलब यह होगा कि सर्वर क्लाइंट के लिए हर अनुरोध के लिए एक नया ऑर्टिकल कुकी (नए सत्र के साथ) भेजेगा।
फ़िक्सेस या तो अपेक्षित सेट करने के लिए web.config में सही है और web.release.config में सही है या डीबग करते समय SSL चालू करें:
नेविल के उत्तर का उपयोग करना (वेब में अपडेट करना आवश्यक है। webfconig में), और जोएल एथरटन के कोड को थोड़ा संशोधित करना, यहां वह कोड है जो उपयोगकर्ता और पृष्ठ के आधार पर एसएसएल मोड और नॉन एसएसएल दोनों मोड में चलने वाली साइट को संभालना चाहिए (I कोड में वापस कूद रहा हूं और अभी तक एसएसएल पर इसका परीक्षण नहीं किया है, लेकिन उम्मीद है कि यह काम करना चाहिए - इसे वापस लाने के लिए बाद में बहुत व्यस्त होगा, इसलिए यहां यह है:
if (HttpContext.Current.Response.Cookies.Count > 0)
{
foreach (string s in HttpContext.Current.Response.Cookies.AllKeys)
{
if (s == FormsAuthentication.FormsCookieName || s.ToLower() == "asp.net_sessionid")
{
HttpContext.Current.Response.Cookies[s].Secure = HttpContext.Current.Request.IsSecureConnection;
}
}
}
एक अन्य संभावना जो सत्र के बीच में परिवर्तन करने का कारण बनती है, यहां तक कि जब सत्र_ऑनस्टार्ट को परिभाषित किया जाता है और / या एक सत्र को प्रारंभ किया गया है, तो यह है कि URL होस्टनाम में एक अमान्य वर्ण (जैसे अंडरस्कोर) है। मेरा मानना है कि यह IE विशिष्ट (सत्यापित नहीं) है, लेकिन यदि आपका URL है, तो कहें http://server_name/app
, तो IE सभी कुकीज़ को ब्लॉक कर देगा और आपके सत्र की जानकारी अनुरोधों के बीच सुलभ नहीं होगी।
वास्तव में, प्रत्येक अनुरोध सर्वर पर एक अलग सत्र को स्पिन करेगा, इसलिए यदि आपके पृष्ठ में कई छवियां, स्क्रिप्ट टैग आदि हैं, तो उन GET अनुरोधों में से प्रत्येक का सर्वर पर एक अलग सत्र होगा।
अधिक जानकारी: http://support.microsoft.com/kb/316112
मेरे मामले में यह मेरे विकास और परीक्षण के वातावरण में बहुत कुछ हो रहा था। बिना किसी सफलता के उपरोक्त सभी समाधानों की कोशिश करने के बाद मैंने पाया कि मैं सभी सत्र कुकीज़ को हटाकर इस समस्या को ठीक करने में सक्षम था। वेब डेवलपर एक्सटेंशन इसे करने में बहुत आसान बनाता है। मैं ज्यादातर फ़ायरफ़ॉक्स का उपयोग परीक्षण और विकास के लिए करता हूं, लेकिन क्रोम में परीक्षण करते समय भी ऐसा हुआ। फिक्स ने क्रोम में भी काम किया।
मुझे अभी तक उत्पादन के माहौल में ऐसा नहीं करना पड़ा है और लोगों को लॉग-इन नहीं कर पाने की कोई रिपोर्ट नहीं मिली है। यह भी सत्र कुकीज़ को सुरक्षित बनाने के बाद ही हुआ। यह अतीत में कभी नहीं हुआ जब वे सुरक्षित नहीं थे।
मेरे मामले में ऐसा इसलिए था क्योंकि मैं एक बाहरी अनुप्रयोग में गेटवे से रीडायरेक्ट करने के बाद सत्र को संशोधित कर रहा था , इसलिए क्योंकि मैं उस पेज url में लोकलहोस्ट के बजाय आईपी का उपयोग कर रहा था, यह वास्तव में अलग-अलग सत्रों के साथ अलग वेबसाइट माना जाता था।
संक्षेप में
यदि आप IIS एक्सप्रेस के बजाय IIS पर होस्ट किए गए एप्लिकेशन को डिबग कर रहे हैं और अपनी मशीन को मिला रहे हैं तो अधिक ध्यान दें। http: // Ip और http: // localhost विभिन्न पृष्ठों में
मेरा मुद्दा Microsoft MediaRoom IPTV एप्लिकेशन के साथ था। यह पता चला है कि MPF MRML एप्लिकेशन कुकीज़ का समर्थन नहीं करते हैं; web.config में कुकलेस सत्रों का उपयोग करने के लिए बदलने से मेरी समस्या हल हो गई
<sessionState cookieless="true" />
यहाँ इसके बारे में वास्तव में एक पुराना लेख है: Cookieless ASP.NET
मैं .NET कोर 2.1 पर हूं और मुझे अच्छी तरह पता है कि सवाल कोर के बारे में नहीं है। फिर भी इंटरनेट की कमी है और Google ने मुझे यहाँ लाया इसलिए कुछ घंटों में किसी को बचाने की उम्मीद है।
Startup.cs
services.AddCors(o => o.AddPolicy("AllowAll", builder =>
{
builder
.WithOrigins("http://localhost:3000") // important
.AllowCredentials() // important
.AllowAnyMethod()
.AllowAnyHeader(); // obviously just for testing
}));
client.js
const resp = await fetch("https://localhost:5001/api/user", {
method: 'POST',
credentials: 'include', // important
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
})
Controllers/LoginController.cs
namespace WebServer.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class UserController : ControllerBase
{
[HttpPost]
public IEnumerable<string> Post([FromBody]LoginForm lf)
{
string prevUsername = HttpContext.Session.GetString("username");
Console.WriteLine("Previous username: " + prevUsername);
HttpContext.Session.SetString("username", lf.username);
return new string[] { lf.username, lf.password };
}
}
}
ध्यान दें कि सत्र लिखना और पढ़ना काम करता है, फिर भी ब्राउज़र को कोई भी कुकीज़ पारित नहीं होती हैं। कम से कम मुझे कहीं भी "सेट-कुकी" हेडर नहीं मिला।
यह मेरे लिए .NET 4.7.2 से शुरू होने के लिए बदल रहा था और यह सत्र कुकी पर समान संपत्ति के कारण था। अधिक जानकारी के लिए यहां देखें: https://devblogs.microsoft.com/aspnet/upcoming-samesite-cookie-changes-in-asp-net-and-asp-net-core/
डिफ़ॉल्ट मान "लैक" में बदल गया और चीजों को तोड़ना शुरू कर दिया। मैंने इसे "कोई नहीं" में बदल दिया और चीजों ने उम्मीद के मुताबिक काम किया।
सुनिश्चित करें कि आपके पास एक सत्र टाइमआउट नहीं है जो बहुत कम है, और यह भी सुनिश्चित करें कि यदि आप कुकी आधारित सत्रों का उपयोग कर रहे हैं जो आप सत्र को स्वीकार कर रहे हैं।
FireFox webDeveloperToolbar कई बार इस तरह से मददगार होती है जैसे आप अपने एप्लिकेशन के लिए कुकीज़ सेट देख सकते हैं।
सत्र ID रीसेट करने के कई कारण हो सकते हैं। हालांकि ऊपर उल्लेख किसी भी मेरी समस्या से संबंधित नहीं है। इसलिए मैं भविष्य के संदर्भ के लिए इसका वर्णन करूंगा।
मेरे मामले में प्रत्येक अनुरोध पर बनाए गए एक नए सत्र के परिणामस्वरूप अनंत अनुप्रेषित लूप मिले। OnActionExecuting इवेंट में पुनर्निर्देशित कार्रवाई होती है ।
क्लाइंट साइड पर कैशिंग साइट्स को रोकने के लिए मैं सभी http हेडर ( ऑनएक्शन एक्सक्लूसिव ईवेंट का उपयोग करके Response.ClearHeaders मेथड) भी क्लीयर कर रहा हूं । लेकिन यह विधि उपयोगकर्ता के सत्र के बारे में informations सहित सभी हेडर को साफ़ करती है, और परिणामस्वरूप Temp स्टोरेज में सभी डेटा (जो मैं प्रोग्राम में बाद में उपयोग कर रहा था)। यहां तक कि Session_Start इवेंट में नया सत्र सेट करने से भी मदद नहीं मिली।
अपनी समस्या को हल करने के लिए मैंने सुनिश्चित किया कि जब रीडायरेक्शन हो जाए तो हेडर न निकालें।
आशा है कि यह किसी की मदद करता है।
मैं इस मुद्दे पर एक अलग तरीके से भागा। जिन नियंत्रकों में यह विशेषता [SessionState(SessionStateBehavior.ReadOnly)]
थी, वे एक अलग सत्र से पढ़ रहे थे, हालांकि मैंने ऐप स्टार्टअप पर मूल सत्र में एक मूल्य निर्धारित किया था। मैं _layout.cshtml के माध्यम से सत्र मूल्य जोड़ रहा था (शायद सबसे अच्छा विचार नहीं है?)
यह स्पष्ट रूप से ReadOnly समस्या का कारण था क्योंकि जब मैंने विशेषता को हटा दिया, तो मूल सत्र (और SessionId) चातुर्य में रहेगा। क्लाउडियो / माइक्रोसॉफ्ट के समाधान का उपयोग करके इसे ठीक किया।