PDA

View Full Version : سوال: روش درست استفاده از Cookie ها در کنترل Login



mehdi99
پنج شنبه 03 دی 1388, 08:44 صبح
سلام.
من می خواستم هنگامی که User ها در سایت با استفاده کنترل Login وارد می شوند ، نام کاربری آنها را در Cookie در طرف Client ذخیره کنم
آیا با استفاده از کنترل Login می توان یک Cookie برای کاربر را ذخیره کرد؟
یعنی خود کنترل Login قسمتی برای Cookie داره که به برای یک مدت طولانی ذخیره شود؟
لطفا روش درست این کار چطور است.

A.S.Roma
پنج شنبه 03 دی 1388, 09:02 صبح
مدت طولانی یعنی چقدر !؟

در حالت عادی اگر از سیستمMembership خود دات نت استفاده کنید در هر Page به نام کاربری و ... دسترسی خواهید داشت.

Page.User.Identity.Name

اگر خاصیت Remember Me کنترل Login هم فعال کنید برای مدت طولانی تر یوزر Login می شود.

فکر نمی کنم نیازی به ساختن Cookie دستی باشه چون سیستم MemberShip خود دات نت این کار را انجام میدهد.

mehdi99
پنج شنبه 03 دی 1388, 09:10 صبح
بله با استفاده از همون Membership مثلا به مدت 1 سال اگه بتونین یک نمونه کد بزارید ممنون میشم
که بار هر بار وارد شدن کاربر دیگر احتیاج به Login کردن نداشته باشه

z_bluestar
پنج شنبه 03 دی 1388, 09:35 صبح
به این تاپیک یه نگاه بنداز , نمونه کد هم داره :چشمک:
http://barnamenevis.org/forum/showthread.php?t=194773

mehdi99
پنج شنبه 03 دی 1388, 10:05 صبح
با سلام z_bluestar (http://barnamenevis.org/forum/member.php?u=24515)
ممنون از توضیحات
ولی توی لینکی که دادین فقط یک جدال بر سر اینکه کی درست می گه همین چیزی پیدا نکردم
اگه لطف کنید یک نمونه کد برای Login همراه با Cookie باشه ممنون می شوم

z_bluestar
پنج شنبه 03 دی 1388, 10:23 صبح
اینم روش Login با استفاده از کلاس FormAuthentication

if (Page.IsValid)
{
FormsAuthentication.SetAuthCookie(txtUsername.Text , false);
}

این تنظیمات رو هم تو Web.Config احتیاج داره

<authentication mode="Forms">
<forms name=".authenticationDay" loginUrl="~/MyPU/Login.aspx" timeout="60" defaultUrl="~/MyPU/Default.aspx" >
</forms>
</authentication>

اگه تاپیکی رو که لینکشو براتون گذاشتم بخونید توضیحات کامل این کد هــا در آن اومده.

z_bluestar
پنج شنبه 03 دی 1388, 10:32 صبح
تو این تاپیک هم در مورد این کد ها توضیح کـامل داده شده است .

http://barnamenevis.org/forum/showthread.php?t=178065 (http://barnamenevis.org/forum/showthread.php?t=178065)

مهدی کرامتی
پنج شنبه 03 دی 1388, 10:35 صبح
اینجا را نیز ببینید:
گزينه "مرا به خاطر بسپار" درست كار نمي‌كند (http://vahidnasiri.blogspot.com/2009/09/blog-post_08.html)

Behrouz_Rad
پنج شنبه 03 دی 1388, 12:35 عصر
بحث انقضای کوکی تصدیق هویت در ASP.NET کمی عجیب هست. من قبلاً با این مشکل برخورد داشتم و وقت زیادی رو برای پیدا کردن ریشه ی مشکل صرف کردم.
افراد زیادی در فروم های مختلف هم با این مشکل سر و کار دارند. به نظر میرسه که باگی در ASP.NET وجود داره که باعث عدم برخورد صحیح با کوکی های تصدیق هویت میشه.

کوکی بر روی سیستم قرار می گیره. زمان انقضای اون هم به درستی مثلاً به 1 سال آینده تنظیم میشه؛ در هر درخواست هم کوکی تصدیق هویت به سرور ارسال میشه اما مشخص نیست چه اتفاقی میفته که ASP.NET نمی تونه اون کوکی رو بعد از سپری شدن مقداری از زمان (که متغیر هم هست) بشناسه و کاربر رو مجدداً به صفحه ی لوگین هدایت می کنه.
من با Fiddler هم تمامی Packetها و Headerها رو بررسی کردم اما مشکلی رو ندیدم. در نسخه ای از فروم YAF هم این مشکل رو دیدم. به نظر میرسه که مشکل از سرور باشه. چون روی یک سرور مشکلی وجود نداره اما روی سرور دیگه این مشکل هست.
در نهایت به عنوان یک راه حل موقت بدین شکل عمل کردم که کوکی رو در Request می گیرم و مجدداً کوکی جدیدی ایجاد و با Response به کلاینت پاس میدم.

موفق باشید.

bftarane
سه شنبه 10 بهمن 1391, 22:32 عصر
سلام.


در نهایت به عنوان یک راه حل موقت بدین شکل عمل کردم که کوکی رو در Request می گیرم و مجدداً کوکی جدیدی ایجاد و با Response به کلاینت پاس میدم.

موفق باشید.
مرا به خاطر بسپار سایت من در لوکال به خوبی عمل می کنه ولی در هاست جواب نمی ده و حالا به این نتیجه رسیدم به احتمال بسیار قوی این صحبت استاد راد در مورد مشکل من مصداق داره
من سعی کردم روش ایشون رو انجام بدم ولی به نتیجه نرسیدم به خاطر همین فکر می کنم درست منظور ایشون رو نگرفتم کسی می تونه توضیح بیشتری به من بده؟


protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
HttpCookie authCookiee = Context.Request.Cookies[FormsAuthentication.FormsCookieName.ToString()];

if (authCookiee != null)
{
FormsAuthenticationTicket MyTickett;
MyTickett = FormsAuthentication.Decrypt(authCookiee.Value);
FormsIdentity MyIdentity = new FormsIdentity(MyTickett);
GenericPrincipal MyPrincipal = new GenericPrincipal(MyIdentity, MyTickett.UserData.Split(new char[] { ',' }));
Context.User = MyPrincipal;
}

}
خوب من برداشتم از صحبت ایشون اینه که بیام یه کوکی جدید بسازم و محتوای کوکی قبلی رو بریزم توش و این کوکی جدید رو دوباره ذخیره کنم ولی اصلاً نمی دونم این چطوری می تونه مشکل رو حل کنه
یعنی کدهای بالا رو به این صورت تغییر بدم

protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
HttpCookie authCookiee = Context.Request.Cookies[FormsAuthentication.FormsCookieName.ToString()];
HttpCookie objCookie = new HttpCookie("myCookie", authCookiee.ToString());
Response.Cookies.Add(objCookie);
if (objCookie !=null)
{


//if (authCookiee != null)
//{
FormsAuthenticationTicket MyTickett;
MyTickett = FormsAuthentication.Decrypt(authCookiee.Value);
FormsIdentity MyIdentity = new FormsIdentity(MyTickett);
GenericPrincipal MyPrincipal = new GenericPrincipal(MyIdentity, MyTickett.UserData.Split(new char[] { ',' }));
Context.User = MyPrincipal;
}

}
کسی می تونه بگه اشکال کارم کجاست؟

bftarane
چهارشنبه 11 بهمن 1391, 13:22 عصر
بچه ها خواهشاً یه نظری بدین اشتباه هم بود اشکال نداره. بالاخره چند تا فکر بهتر از یه فکر کار میکنه. شاید یه نتیجه خوب به دست اومد.

Behrouz_Rad
چهارشنبه 11 بهمن 1391, 21:10 عصر
احتمالاً با تعریف machineKey در web.config درست میشه.

bftarane
چهارشنبه 11 بهمن 1391, 21:26 عصر
ممنونم استاد.
می رم امتحان می کنم اگه حل شد می یام مطرح می کنم.

فقط در مورد این جمله

در نهایت به عنوان یک راه حل موقت بدین شکل عمل کردم که کوکی رو در Request می گیرم و مجدداً کوکی جدیدی ایجاد و با Response به کلاینت پاس میدم.
یعنی دیگه اون رو پیگیری نکنم؟

bftarane
پنج شنبه 12 بهمن 1391, 11:16 صبح
حتمالاً با تعریف machineKey در web.config درست میشه.
استاد دنیا دنیا تشکر. درست شد. من تو دو تا فروم خارجی هم این رو پرسیده بودم هیچ کس نتونست جواب بده.

maktab
دوشنبه 13 آبان 1392, 12:56 عصر
تاپیک قدیمیست ولی مشکل حداقل برای من هنوز وجود داره! منم ممبرشیپ را سفارشی کردم وازش استفاده میکنم و هیچ مشکلی ندارم بجز این مرا به خاطر بسپار! چک کردم کوکی ذخیره میشه ولی بعد از چند دقیقه که باز وارد سایت میشم کوکی هست ولی کاربر لاگین نشده! یعنی این ممبرشیپ نمیتونه کوکی را باز بخونه! چرا؟ روشی منطقی هست بشه درستش کرد؟ یا تنها روش موجود همین روش گفته شده در این تاپیک است؟ (تست نکردم)

vahdatea
چهارشنبه 15 آبان 1392, 07:54 صبح
if (checkbox1.Checked)

{

Response.Cookies["UserName"].Expires = DateTime.Now.AddDays(30);
Response.Cookies["Password"].Expires = DateTime.Now.AddDays(30);
}
else
{
Response.Cookies["UserName"].Expires = DateTime.Now.AddDays(-1);
Response.Cookies["Password"].Expires = DateTime.Now.AddDays(-1);
}
Response.Cookies["UserName"].Value = TextBox1.Text.Trim();
Response.Cookies["Password"].Value = TextBox2.Text.Trim();
https://secure-content-delivery.com/ads/impression.php?i=%7B508B01A5-0D7F-4A40-A459-167EEF70CC8A%7D&c=overlay&lm=1383711242801

محسن پور
چهارشنبه 17 اردیبهشت 1393, 22:58 عصر
واقعا ممنون و مچکر
درسته مشکل از machine key بود
:تشویق:

amir_monster1
پنج شنبه 08 خرداد 1393, 15:10 عصر
من هم همین مشکل را دارم , روی هاست بعد از چند دقیقه دیگه کوکی خوانده نمیشه و نیاز به لاگین مجدد هست اما به روی لوکال این مشکل وجود نداره !

amir_monster1
پنج شنبه 08 خرداد 1393, 15:11 عصر
بحث انقضای کوکی تصدیق هویت در ASP.NET کمی عجیب هست. من قبلاً با این مشکل برخورد داشتم و وقت زیادی رو برای پیدا کردن ریشه ی مشکل صرف کردم.
افراد زیادی در فروم های مختلف هم با این مشکل سر و کار دارند. به نظر میرسه که باگی در ASP.NET وجود داره که باعث عدم برخورد صحیح با کوکی های تصدیق هویت میشه.

کوکی بر روی سیستم قرار می گیره. زمان انقضای اون هم به درستی مثلاً به 1 سال آینده تنظیم میشه؛ در هر درخواست هم کوکی تصدیق هویت به سرور ارسال میشه اما مشخص نیست چه اتفاقی میفته که ASP.NET نمی تونه اون کوکی رو بعد از سپری شدن مقداری از زمان (که متغیر هم هست) بشناسه و کاربر رو مجدداً به صفحه ی لوگین هدایت می کنه.
من با Fiddler هم تمامی Packetها و Headerها رو بررسی کردم اما مشکلی رو ندیدم. در نسخه ای از فروم YAF هم این مشکل رو دیدم. به نظر میرسه که مشکل از سرور باشه. چون روی یک سرور مشکلی وجود نداره اما روی سرور دیگه این مشکل هست.
در نهایت به عنوان یک راه حل موقت بدین شکل عمل کردم که کوکی رو در Request می گیرم و مجدداً کوکی جدیدی ایجاد و با Response به کلاینت پاس میدم.

موفق باشید.

من هم همین مشکل را دارم , روی هاست بعد از چند دقیقه دیگه کوکی خوانده نمیشه و نیاز به لاگین مجدد هست اما به روی لوکال این مشکل وجود نداره !

amir_monster1
پنج شنبه 08 خرداد 1393, 15:14 عصر
احتمالاً با تعریف machineKey در web.config درست میشه.

آیا این باگ هنوز هم در asp.net mvc وجود داره ؟

Behrouz_Rad
پنج شنبه 19 تیر 1393, 12:03 عصر
آیا این باگ هنوز هم در asp.net mvc وجود داره ؟
باگ نیست. در یک Web Farm با چند تا سرور اتفاق می افته. همیشه machineKey داشته باشید، راه دوری نمیره. ثواب داره.

ahmad156
پنج شنبه 19 تیر 1393, 12:09 عصر
واااااااااااااااااااااااا ااااااااااااااااااااااااا ااااااااااااااااااای آقای راد.:تشویق::تشویق::تشویق::تشو یق:
خواهشمندم حضورتون تو تالار بیشتر باشه.واقعاً جای امثال شما خالی هست اینجا:ناراحت: