چطور کاربر login شده رو از کوکی بخونم؟؟؟
Printable View
چطور کاربر login شده رو از کوکی بخونم؟؟؟
شما الان مگه کوکی تعریف کردید؟ کوکی رو فراموش برید سراغ سشن.
کوکی تو mvc معنا نداره .بعد واسه چی میخوای کاربر از کوکی بخونی؟؟
از HttpContext برای ساختن و بازخوانی Session استفاده کنید. میتوانید اطلاعات کاربری که login کرده در آنجا ذخیره کنید.
وقتی کابری login میکنه باید این کد رو اجرا کنید تا نام کاربری اون در cookie مخصوص Authentication ثبت بشه
FormsAuthentication.SetAuthCookie(username,false)
وقتی کاربری لاگین میکنه مگه نیازه اونو در کوکی یا سشن ذخیره کنیم؟
خودش که اینکار رو میکنه. لزومی نداره ما اینارو ست کنیم.
اطلاعات کاربر رو چه در Controller و چه در View می تونید با User.Identity بدست بیارید، این اطلاعات در Http request جاری بدست شما میرسه و لازم نیست کار اضافه ای انجام بدین، مثلاً User.Identity.IsAuthenticated نشون میده لاگین شده یا نه؟ یا User.Identity.Name نام کاربر لاگین شده و ...
من که فکر میکنم برعکسه! سشن برای ASP کلاسیک بود و درصورت عدم استفاده صحیح (که معمولاً هم همینطور هست!) بار پردازشی زیاد روی سرور میندازه و روی حافظه و پردازش موازی درخواست ها تاثیر مخرب داره (سریالایز نشدن صحیح درخواست ها در سرور)؛ از طرف دیگه خود Session هم سمت کلاینت از Cookie برای نگهداری SessionID استفاده میکنه و سمت سرور برای بازیابی Session از اون استفاده میکنه؛ خلاصش اینکه اگه داده ها طوری هست که میشه با Cookie از عهدش بر اومد (Dictionary, Object و ... نیستن) بهتره کلاً سشن تو Web.config غیرفعال بشه تا کارآئی کلی سایت بره بالا ...
بیشتر
یه همچین کلاسی مثل چیزی که تو زیره بسازید و هر وقت کسی خواست لاگین کرد پاسش بدید به این کلاس:
public void SetAuthenticationToken(string name, bool isPersistant, User userData)
{
string data = null;
if (userData != null)
data = new JavaScriptSerializer().Serialize(userData);
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, name, DateTime.Now, DateTime.Now.AddYears(1), isPersistant, userData.UserId.ToString());
string cookieData = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, cookieData)
{
HttpOnly = true,
Expires = ticket.Expiration
};
HttpContext.Current.Response.Cookies.Add(cookie);
}
بعد تو اکشن لاگین بنویسید:
var authenticatedUser = userApp.GetUserByEmailAndPassword(user);
if (authenticatedUser != null)
{
context.SetAuthenticationToken(authenticatedUser.E mail, false, authenticatedUser);
return RedirectToAction("Index");
}
که تو خط اول می خونم ببینم همچین کاربری وجود داره یا نه که اگه داشت میفرستمش تو اون کلاسه که براش کوکی بسازه.
بعد هر جا بخواید دیگه می تونید با کلمه ی کلیدی User کاربر رو از کوکی بخ.نید.اطلاعاتی مثل اینکه این کاربر الان لاگین هستش یا نه (User.Identity.IsAuthenticated) یا چیزایی مثل نام طرف(User.Identity.Name)(که می تونید به جای نام UserId) طرف رو تو این متغیر بریزید و...
که البته راهش اینه که یه متد استاتیک داشته باشید که تمام اطلاعات کاربر لاگین کرده رو (کاربر لاگین کرده رو همونطور که خط بالا گفتم می تونید پیداش کنید) از دیتابیس بخونه و هر جا خواستید این تابع مفید رو صدا بزنید.از تابع استفاده کنید و باهاش کار کنید خودتون متوجه می شید.