এএসপি.নেট: সেশন.সেশন-এর অনুরোধগুলির মধ্যে পরিবর্তন হয়


142

কেন সম্পত্তি নেই sessionId উপর সেশন অনুরোধের মধ্যে একটি ASP.NET পৃষ্ঠার পরিবর্তন -object?

আমার মতো একটি পৃষ্ঠা রয়েছে:

...
<div>
    SessionID: <%= SessionID %>
</div>
...

এবং ব্রাউজারের চেয়ে পৃথক আমি F5-এ আঘাত করলে প্রতিবার আউটপুট পরিবর্তন হয়।

উত্তর:


225

এই কারন

কুকি-ভিত্তিক সেশন স্থিতি ব্যবহার করার সময়, সেশন অবজেক্টটি ব্যবহার না করা অবধি এএসপি.এনইটি সেশন ডেটার জন্য সঞ্চয়স্থান বরাদ্দ করে না। ফলস্বরূপ, সেশন অবজেক্টটি অ্যাক্সেস না করা পর্যন্ত প্রতিটি পৃষ্ঠার অনুরোধের জন্য একটি নতুন সেশন আইডি উত্পন্ন হয়। যদি আপনার অ্যাপ্লিকেশনটির পুরো সেশনের জন্য একটি স্থিতিক সেশন আইডি প্রয়োজন হয়, আপনি হয় সেশন আইডি ঠিক করার জন্য অ্যাপ্লিকেশনটির গ্লোবাল.অ্যাসাক্স ফাইলটিতে সেশন_সেট্ট পদ্ধতিটি প্রয়োগ করতে পারেন এবং সেশন আইটেমে স্টোরের ডেটা সংরক্ষণ করতে পারেন, বা আপনি আপনার অন্য কোনও অংশে কোড ব্যবহার করতে পারেন সেশন অবজেক্টে স্পষ্টভাবে ডেটা সঞ্চয় করার জন্য অ্যাপ্লিকেশন।

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;
}

23
আমি জানতাম না, এটি নিয়ে কোনও সমস্যা হয়নি তবে এটি জানতে আগ্রহী
ফারাবাস

1
@ ক্লাডুডিও আপনি কেবল কোডের এক লাইনে ফেলে দিতে পারেন এবং আপনার উত্তরটি নিখুঁত। একটি আকর্ষণীয় প্রশ্ন থেকে আকর্ষণীয় তথ্য আসছে ... আরও একটি? ;)
সেব নীলসন

2
আকর্ষণীয়ভাবে যথেষ্ট, এটি আমার সমস্যাটি সমাধান করে - তবে সমস্যাটি ছাড়াই কোডবেস ব্যবহারের প্রায় 6 মাস পরে কেবল সমস্যাটি প্রকাশ পেয়েছিল। হঠাৎ কেন এটির পরিবর্তিত হবে এমন কোনও কারণ আমি ভাবতে পারি না - সেশনেড যখন আগে ছিল না তখন হঠাৎ পুনরায় সেট হয়ে যাওয়ার কোনও কারণ কি কেউ বলতে পারেন?
মৌ

2
@ কুমারহর্ষ: একবার আপনি কোনও বিষয় সেশনে সংরক্ষণ করলে সেশন আইডি ঠিক হয়ে যাবে। "আপনি যদি ব্যাকএন্ডে আপনার সেশন অবজেক্টটি অ্যাক্সেস না করেন ..." দিয়ে বলতে চাইছিলাম তবে এটিই। একবার আপনি someidঅধিবেশন বরাদ্দ করুন যদি একই থাকে। এই উত্তরটি 4 বছরেরও বেশি পুরানো, এ সম্পর্কে কোনও পরিবর্তন হয়েছে কিনা তা নিশ্চিত নন তা বিবেচনা করুন।
ক্লোদিও রেডি

9
আমি লক্ষ্য করেছি যে আমার গ্লোবাল.অ্যাস্যাক্সে কিছু না করে সেশন_শার্ট পদ্ধতিটি কেবল এই কাজটি করে। টিপটির জন্য ধন্যবাদ @ ক্লাদিও।
পেড্রো

92

আরও একটি कपटी কারণ রয়েছে, স্লাডুডিও দ্বারা প্রদর্শিত হিসাবে সেশন অবজেক্টটি আরম্ভ করা হলেও এটি কেন ঘটতে পারে।

ওয়েবকনফিগে, যদি এমন কোনও <httpCookies>এন্ট্রি থাকে যা সেট করা থাকে requireSSL="true"তবে আপনি আসলে এইচটিটিপিএস ব্যবহার করছেন না: একটি নির্দিষ্ট অনুরোধের জন্য সেশন কুকি প্রেরণ করা হয় না (বা সম্ভবত ফিরে আসেনি, আমি নিশ্চিত নই) যার অর্থ আপনি প্রতিটি অনুরোধের জন্য একেবারে নতুন সেশন দিয়ে শেষ করেন।

আমি এটিকে একটি শক্ত উপায়ে পেয়েছি, আমার উত্স নিয়ন্ত্রণে বেশ কয়েকটি প্রতিশ্রুতির মধ্যে বেশ কয়েক ঘন্টা পিছনে এবং পিছনে সময় ব্যয় করেছি, যতক্ষণ না আমার সুনির্দিষ্ট পরিবর্তনটি আমার আবেদনটি ভেঙে দিয়েছে।


5
আমি এটি জানতাম তবে তবুও প্রতি 3 মাস অন্তর এটি ভুলে গিয়েছি এবং ডিবাগিংয়ের জন্য কয়েক ঘন্টা ব্যয় করি ..
সটনে

আমার ক্ষেত্রে, আমি লোকালহোস্টে পরীক্ষা করছিলাম এবং ওয়েবকনফিগের "প্রয়োজনীয় এসএসএল" "সত্য" হিসাবে সেট করা হয়েছিল। ধন্যবাদ।
উইলিয়াম পেরেইরা

এটি আমার ক্ষেত্রে ছিল এবং আমি এটি বের করার চেষ্টা করে অনেক বেশি সময় ব্যয় করেছি (বিভিন্ন ওয়েবকনফিগ ফাইলগুলির সাথে একটি লাল রঙের হেরিং ছিল)।
jmoreno

আপনার উপরের পরামর্শটি এখনও 2018 সালে সহায়তা করছে This এটি সর্বাধিক ঘন ঘন দৃশ্য। ধন্যবাদ!
বিজয় বনসাল

5

আমার ক্ষেত্রে আমি বুঝতে পেরেছি যে সেশন কুকির একটি ডোমেন রয়েছে যাতে www.উপসর্গ অন্তর্ভুক্ত ছিল, আমি পৃষ্ঠাটি নংয়ের সাথে অনুরোধ করছি www.। ইউআরএল
যুক্ত www.করার সাথে সাথে সমস্যাটি সমাধান করা হয়েছে। পরে আমি কুকির ডোমেন .mysite.comপরিবর্তে সেট করতে সেট করলাম www.mysite.com


5

আমার সমস্যাটি ছিল আমাদের ওয়েবকনফাইগে এই সেটটি ছিল

<httpCookies httpOnlyCookies="true" requireSSL="true" />

এর অর্থ হ'ল নন-এসএসএল (ডিফল্ট) এ ডিবাগ করার সময়, লেখক কুকিটি আবার সার্ভারে প্রেরণ করা হবে না। এর অর্থ হ'ল সার্ভারটি প্রতিটি অনুরোধের জন্য ক্লায়েন্টকে ফিরে একটি নতুন লেখক কুকি (একটি নতুন সেশন সহ) প্রেরণ করবে।

সমাধানটি হয় ওয়েবকনফাইগে মিথ্যাতে সত্য এবং ওয়েব.রেইল.কমফ্যাগে সত্যে সেট করা বা ডিবাগ করার সময় এসএসএল চালু করতে হয়:

এসএসএল চালু করুন


২০১১ সালের নেভিল কুকের উত্তরের সাথে এটি কীভাবে আলাদা?
ইয়ান কেম্প

4

নেভিলির উত্তরটি ব্যবহার করা (ওয়েবকনফিগের ক্ষেত্রে এসএসএল = সত্য মুছে ফেলা) এবং জোয়েল ইথারটনের কোডটি কিছুটা সংশোধন করার জন্য, ব্যবহারকারীর এবং পৃষ্ঠার উপর নির্ভর করে এসএসএল মোড এবং নন এসএসএল উভয় মোডে চলমান একটি সাইট পরিচালনা করতে হবে এমন কোড এখানে রয়েছে is আমি কোডে ফিরে যাচ্ছি এবং এটি এখনও এসএসএলে পরীক্ষা করে দেখিনি, তবে আশা করি এটির কাজ করা উচিত - এটি ফিরে পেতে খুব ব্যস্ত হবে পরে, তাই এটি এখানে:

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;
                }
            }
        }

2

সেশন_অনস্টার্ট সংজ্ঞায়িত করা এবং / অথবা একটি সেশন সূচনা করা হলেও, সেশনটি অনুরোধগুলির মধ্যে পরিবর্তনের কারণ হিসাবে আরেকটি সম্ভাবনা রয়েছে যে ইউআরএল হোস্টনেমটিতে একটি অবৈধ অক্ষর (যেমন একটি আন্ডারস্কোর) রয়েছে। আমি বিশ্বাস করি এটি আইই নির্দিষ্ট (যাচাই করা হয়নি), তবে যদি আপনার ইউআরএল হয়, তবে বলুন http://server_name/app, তবে আইই সমস্ত কুকিজ আটকে দেবে এবং অনুরোধের মধ্যে আপনার সেশন তথ্য অ্যাক্সেসযোগ্য হবে না।

প্রকৃতপক্ষে, প্রতিটি অনুরোধ সার্ভারে একটি পৃথক সেশনটি স্পিন করবে, সুতরাং আপনার পৃষ্ঠাতে যদি একাধিক চিত্র, স্ক্রিপ্ট ট্যাগ ইত্যাদি থাকে, তবে সেই সমস্ত জিইটি অনুরোধের ফলে সার্ভারে একটি পৃথক সেশনের ফলস্বরূপ।

আরও তথ্য: http://support.microsoft.com/kb/316112


2

আমার ক্ষেত্রে এটি আমার বিকাশ এবং পরীক্ষার পরিবেশগুলিতে অনেক ঘটছিল। কোনও সফলতা ছাড়াই উপরের সমস্ত সমাধানের চেষ্টা করার পরে আমি দেখতে পেলাম যে সমস্ত সেশন কুকিজ মুছে ফেলে আমি এই সমস্যাটি সমাধান করতে সক্ষম হয়েছি। ওয়েব বিকাশকারী এক্সটেনশান এটি করা খুব সহজ করে তোলে। আমি বেশিরভাগই ফায়ারফক্সকে পরীক্ষার এবং বিকাশের জন্য ব্যবহার করি তবে ক্রোমে পরীক্ষার সময় এটিও ঘটেছিল। ফিক্সটি ক্রোমেও কাজ করেছিল।

উত্পাদনের পরিবেশে আমাকে এখনও এটি করতে হয়নি এবং লোকেরা লগ ইন করতে না পারার কোনও খবর পাইনি This এটি কেবলমাত্র সেশন কুকিজকে সুরক্ষিত করার পরেই ঘটেছে বলে মনে হয়েছিল। অতীতে কখনই তারা নিরাপদ ছিল না।


আপডেট: এটি কেবলমাত্র সেশন কুকিটিকে সুরক্ষিত করার জন্য পরিবর্তন করার পরে এটি শুরু হয়েছিল। আমি নির্ধারণ করেছি যে একই পথ এবং ডোমেন সহ ব্রাউজারে দুটি বা ততোধিক সেশন কুকিজ থাকার কারণে সঠিক সমস্যাটি হয়েছিল। সর্বদা যে সমস্যাটি ছিল তা হ'ল তার খালি বা নাল মান। নির্দিষ্ট কুকি মুছে ফেলার পরে সমস্যাটি সমাধান করা হয়েছিল। এই গালি কুকিটি পরীক্ষা করার জন্য আমি Global.asax.cs Sessin_Start পদ্ধতিতে কোডও যুক্ত করেছি এবং যদি এটি সেট করা থাকে তবে অতীতের কোনওটির মেয়াদ শেষ হওয়ার তারিখ।
ম্যাট এল

2

আমার ক্ষেত্রে এটি ছিল কারণ আমি একটি বাহ্যিক অ্যাপ্লিকেশনটিতে গেটওয়ে থেকে পুনর্নির্দেশের পরে সেশনটি সংশোধন করছিলাম , সুতরাং যে পৃষ্ঠার url এ আমি লোকালহোস্টের পরিবর্তে আইপি ব্যবহার করছিলাম এটি আসলে বিভিন্ন সেশন সহ বিভিন্ন ওয়েবসাইট হিসাবে বিবেচিত হয়েছিল।

সংক্ষেপে

আপনি যদি আইআইএস এক্সপ্রেসের পরিবর্তে আইআইএস-এ কোনও হোস্টেড অ্যাপ্লিকেশনটি ডিবাগ করছেন এবং আপনার মেশিনটি বিভিন্ন পৃষ্ঠায় HT: // আইপি এবং http: // লোকালহোস্ট মিশ্রিত করছেন তবে আরও মনোযোগ দিন


1

আমার সমস্যাটি ছিল একটি মাইক্রোসফ্ট মিডিয়ারুম আইপিটিভি অ্যাপ্লিকেশন নিয়ে। দেখা যাচ্ছে যে এমপিএফ এমআরএমএল অ্যাপ্লিকেশনগুলি কুকিজ সমর্থন করে না; ওয়েলকনফাইগের কুকিবিহীন সেশনগুলি ব্যবহার করতে পরিবর্তন আমার সমস্যার সমাধান করেছে

<sessionState cookieless="true"  />

এটি সম্পর্কে একটি সত্যই পুরানো নিবন্ধ: কুকিবিহীন এএসপি.নেট


1

আমি .NET কোর 2.1 এ রয়েছি এবং আমি ভাল করেই জানি যে প্রশ্নটি কোর সম্পর্কে নয়। তবুও ইন্টারনেটের অভাব রয়েছে এবং গুগল আমাকে এখানে এনেছে যাতে কয়েক ঘন্টা বাঁচানোর আশায়।


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 };
        }
    }
}

লক্ষ্য করুন যে সেশন রাইটিং এবং রিডিং কাজ করে, তবুও কোনও কুকি ব্রাউজারে পৌঁছেছে বলে মনে হয় না। কমপক্ষে আমি "সেট-কুকি" শিরোনামটি কোথাও পাইনি।


1

এটি নেট .NET 4.7.2 দিয়ে শুরু করে আমার জন্য পরিবর্তন করা হয়েছিল এবং এটি সেশন কুকিতে সেমসাইট সম্পত্তি থাকার কারণে। আরও তথ্যের জন্য এখানে দেখুন: https://devblogs.microsoft.com/aspnet/up आगामी-samesite-cookie-changes-in-asp-net-and-asp-net-core/

ডিফল্ট মান "লক্ষ" এ পরিবর্তিত হয়ে জিনিস ভাঙতে শুরু করে। আমি এটিকে "কিছুই নয়" এ পরিবর্তন করেছিলাম এবং জিনিসগুলি প্রত্যাশা অনুযায়ী কাজ করেছিল।


0

নিশ্চিত হয়ে নিন যে আপনার কোনও সেশন সময়সীমা খুব অল্প সময়ের মধ্যে নেই এবং এটিও নিশ্চিত হয়ে নিন যে আপনি যদি কুকি ভিত্তিক সেশনগুলি ব্যবহার করছেন যা আপনি সেশনটি গ্রহণ করছেন।

আপনার অ্যাপ্লিকেশনের জন্য সেট কুকিজগুলি দেখতে পাওয়ায় ফায়ারফক্স ওয়েব ডেভেলপারটুলবার এ জাতীয় সময়ে সহায়ক।


2
আমি অনুমান করছি আমার সেশনটির সময়সীমা এক সেকেন্ডের নীচে সেট করা হয়নি। এটি প্রতিটি দ্রুত এফ 5-প্রেসের সাথে পরিবর্তিত হয়।
শেব নীলসন

0

সেশন আইডি পুনরায় সেট করার অনেক কারণ থাকতে পারে। তবে উপরে উল্লিখিত যেকোনটিই আমার সমস্যার সাথে সম্পর্কিত নয়। সুতরাং আমি এটি ভবিষ্যতের রেফারেন্সের জন্য বর্ণনা করব।

আমার ক্ষেত্রে প্রতিটি অনুরোধে তৈরি হওয়া একটি নতুন অধিবেশন ফলস্বরূপ অসীম পুনঃনির্দেশ লুপের ফলে। পুনঃনির্দেশ ক্রিয়াটি OnActionExecutes ইভেন্টে ঘটে

এছাড়াও আমি (এছাড়াও সমস্ত HTTP হেডার ক্লিয়ারিং করে থাকেন OnActionExecuting ব্যবহার ঘটনা Response.ClearHeaders অর্ডার ক্লায়েন্ট সাইড উপর ক্যাশে সাইট প্রতিরোধ করার জন্য পদ্ধতি)। তবে সেই পদ্ধতিটি ব্যবহারকারীর সেশন সম্পর্কে তথ্য সহ সমস্ত শিরোলেখ সাফ করে এবং ফলস্বরূপ টেম্প স্টোরেজের সমস্ত ডেটা (যা আমি পরে প্রোগ্রামে ব্যবহার করছিলাম)। এমনকি সেশন_সত্তা ইভেন্টে নতুন অধিবেশন সেট করা কোনও লাভ হয়নি।

আমার সমস্যা সমাধানের জন্য আমি নিশ্চিত করেছি যে কোনও পুনর্নির্দেশ ঘটে তখন শিরোনামগুলি সরাতে হবে না।

আশা করি এটি কাউকে সাহায্য করবে।


0

আমি এই ইস্যুটিকে অন্যভাবে দৌড়েছি। এই বৈশিষ্ট্যটি [SessionState(SessionStateBehavior.ReadOnly)]ছিল এমন কন্ট্রোলাররা আলাদা আলাদা সেশন থেকে পড়ছিলেন যদিও আমি অ্যাপ্লিকেশনটি শুরু হওয়ার পরে মূল সেশনে একটি মান সেট করেছিলাম। আমি _layout.cshtml (সম্ভবত সেরা ধারণা না?) এর মাধ্যমে সেশনটির মান যুক্ত করছিলাম

এটি স্পষ্টতই ReadOnly সমস্যা সৃষ্টি করেছিল কারণ যখন আমি বৈশিষ্ট্যটি সরিয়ে ফেলি তখন মূল সেশনটি (এবং সেশনআইড) কৌশল অবলম্বন করে। ক্লডিও / মাইক্রোসফ্ট এর সমাধান ব্যবহার এটি স্থির করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.