PDA

View Full Version : تغییر رفتار Session Manager استاندارد در استفاده از Cookie ها



ghabil
شنبه 05 آبان 1386, 11:56 صبح
سلام به دوستان ASP.Net کار
همونطوری که میدونید Session State Managment دات نت بصورت پیش فرض کوکیها رو بصورت Session Cookie تعریف میکنه، میخواستم ببینم کسی راه ساده و بی دردسری (بجز نوشتن Session State Manager خودم) سراغ داره که من بتونم کوکیها رو Persitant بکنم توی کلاینت.
در واقع می خوام مثلا اگر کاربر وسط کار خودش یک پنجره جدید باز کرد، یا مثلا پنجرش رو بست و دوباره باز کرد، کوکیهایی که دات نت برای Session Managment فرستاده بود حفظ شده باشند و دوباره فرستاده بشند تا کاربر به اطلاعات Sessionش دسترسی داشته باشه.

anubis_ir
شنبه 05 آبان 1386, 13:27 عصر
چرا از کوکی سشن می‌خواهید استفاده کنید؟ از کوکی معمولی استفاده کنید. مثل همین فوروم. این فوروم از طریق اطلاعات کوکی شما، سشن شما را مجددا فعال می‌کند.
ضمنا forms authentication چنین قابلیتی رو که شما می‌خواهید دارد (FormsAuthenticationTicket را جستجو کنید) ولی بدلایل امنیتی بهتر است از آن (یعنی حالت persistent) استفاده نکنید. (البته اینجا forms authentication cookie نام دارد و با کوکی سشن متفاوت است)

ghabil
شنبه 05 آبان 1386, 13:41 عصر
من نمیخوام استفاده کنم Session Manager پیش فرض دات نت استفاده میکنه ، من خودم همیشه از پرسیستنت کوکی استفاده میکنم ، سوالم هم همین بود که چطوری میتونم پیش فرضش رو به Persistant Cookie تغییر بدم.
دقت کنید از Session State Manager پیش فرض دات نت استفاده میکنم ، یعنی من کوکیها رو نمیسازم.

Behrouz_Rad
شنبه 05 آبان 1386, 13:51 عصر
نمیشه!
چون SID در هر مرحله تولید متفاوت هست و این SID به صورت خودکار و بدون دخالت برنامه نویس تولید میشه و زمانی که این SID از حافظه ی Server خارج شد، Server دیگه Session رو نمیشناسه!

موفق باشید.

anubis_ir
شنبه 05 آبان 1386, 14:03 عصر
من نمیخوام استفاده کنم Session Manager پیش فرض دات نت استفاده میکنه ، من خودم همیشه از پرسیستنت کوکی استفاده میکنم ، سوالم هم همین بود که چطوری میتونم پیش فرضش رو به Persistant Cookie تغییر بدم.
دقت کنید از Session State Manager پیش فرض دات نت استفاده میکنم ، یعنی من کوکیها رو نمیسازم.

حالت اعتبار سنجی استاندارد forms authentication مورد persistent authentication cookie رو داره.
به FormsAuthenticationTicket در مثال زیر دقت کنید --- پنجمین آرگومان سازنده FormsAuthenticationTicket
http://msdn2.microsoft.com/en-us/library/system.web.security.formsauthenticationticket.aspx

فقط زمانیکه مرورگر بسته می‌شود اگر می‌خواهید این کوکی منقضی نشود باید به مثال زیر در مورد زمان مربوطه دقت کنید
http://blogs.msdn.com/tmeston/archive/2003/07/24/10505.aspx

ghabil
شنبه 05 آبان 1386, 14:21 عصر
نمیشه!
چون SID در هر مرحله تولید متفاوت هست و این SID به صورت خودکار و بدون دخالت برنامه نویس تولید میشه و زمانی که این SID از حافظه ی Server خارج شد، Server دیگه Session رو نمیشناسه!

موفق باشید.

نه عزیز ، Session توی سرور که هنوز اکسپایر نشده ، منظورم زمانیکه سشن توی سرور هنوز هست ولی کلاینت با بسته شدن Browser چون کوکیها رو توی حافظه نگه داشته بوده ، نه به شکل فیزیکی ، ارتباطش رو با Session توی سرور از دست میده....




حالت اعتبار سنجی استاندارد forms authentication مورد persistent authentication cookie رو داره.

آقا دستت درد نکنه اطلاعات جالبی بود ، اما من باید از Mode Windows استفاده کنم ، اصولا هم فرم ASPXی ندارم ، یکسری RequestHandler دارم فقط.

Behrouz_Rad
شنبه 05 آبان 1386, 16:56 عصر
البته نمیدونم پاسخ anubis_ir چه ارتباطی با سوالت داره!
به هر حال...
فرایند شناسایی Session مربوط به کلاینت از طریق SID انجام میشه. این SID یک عبارت 24 کاراکتری هست که توسط کلاس SessionIDManager ایجاد و مدیریت میشه.
پس از تولید SID، مشخصه ی تولید شده در یک کوکی با نام ASP.NET_SessionId قرار میگیره.
اگر بتونی مدیریت توضیحات فوق رو خودت بر عهده بگیری، احتمالا کاری رو که میخوای میتونی انجام بدی.
بدین منظور باید متدهای کلاس SessionIDManager رو Override کنی. متدهایی از قبیل CreateSessionID و Validate و کوکی Session رو با برنامه نویسی به مرورگر ارسال کنی.
این توضیحات همگی تئوری هستند و در حال حاضر به ذهنم رسیدند اما پیاده سازی عملی اونها منطقا باید مشکل رو بر طرف کنه.

موفق باشید.

ghabil
شنبه 05 آبان 1386, 18:19 عصر
راستش من هم متوجه نمیشم به نحوه ایجاد SID چه ربطی داره ؟! جایی خونده بودم که باید متد ایجاد کوکی رو Override کنم که یک Persitant کوکی بسازه که SID ساخته شده توی باقی بمونه که خب کاملا هم بنظرم منطقی اومد ، اما برای این کار نیاز به نوشان Session State Managerخودم رو دارم. جایی هم نتونستم چیزه دیگه ای پیدا کنم ، گفتم شاید بچه ها اینجا چیز راحتتری به ذهنشون برسه من بتونم در راستای اصل تنبلی قدم بردارم که متاسفانه با توضیحات تو بنظر میاد که شدنی نیست ، به هر حال ممنون از وقتی که گذاشتین. اگر تو پیاده سازیش به مشکل خوردم با اجازه بازم مزاحم میشم...

Behrouz_Rad
شنبه 05 آبان 1386, 19:41 عصر
جایی خونده بودم که باید متد ایجاد کوکی رو Override کنم
درست خوندی اما فکر کردی که این Override به چه شکل انجام میشه؟
با استفاده از مدیر SID که همون کلاس SessionIDManager هست که در پست قبلی توضیح دادم.

هر چیزی(!) رو بهر کاری ساختند...

موفق باشید.

ghabil
شنبه 05 آبان 1386, 22:49 عصر
بالاخره یک راه تنبلی پیدا کردم D:

راستش جایی داکیومنت پیدا نکردم که اگه واسه کوکیها ExpirationTime بزارم Persitant میشند ولی خب گذاشتم و شدن ، به هر حال با این کلک که: لحظه آخر Header پاسخ رو بگیرم و کوکی SID رو مقدار Expirationش رو ست کنم ، کار کرد .
این کدش :


private void Application_PreSendRequestHeaders(object sender, System.EventArgs e)
{
HttpApplication app = ((HttpApplication)(sender));
app.Response.Cookies["ASP.NET_SessionId"].Expires = DateTime.Now.AddMinutes(10); //حالا یا 10 یا هر عددی که مقدار TimeOut SessionState هست.
}


فقط میترسم از اون شرایطی باشه که راه های تنبلی بعدا آدم رو گیر میندازند ، اگر نکته ای بنظرتون میرسه ممنون مشم بهم بگین.

Behrouz_Rad
یک شنبه 06 آبان 1386, 06:42 صبح
راه خوبیه... فقط به شکل یک HttpModule پیاده سازیش کن.

موفق باشید.