ورود

View Full Version : سوال: افزودن نقش به کاربری که در حال حاضر لاگین است



bftarane
پنج شنبه 30 فروردین 1397, 18:59 عصر
سلام
سناریو به این صورته
کاربر لاگین کرده و بعد از پرداخت موفق یک نقش بهش اختصاص داده میشه
نقش در جدول اضافه میشه به درستی

ولی مشکلی که وجود داره اینه که تا وقتی که این کاربر logout و login مجدد انجام نده

[Authorize(Roles = "VIP")]
کار نمی کنه


راهی که سریعا به ذهن می رسه اینه که خودمون در کد، کاربر رو signout و singin مجدد کنیم

ولی چطور بدون دسترسی به پسورد کاربر میشه فقط با استفاده از نام کاربری، خودمون کاربر رو لاگین کنیم؟
(با فرض استفاده از asp.net mvc5 و Identity 2.0


ممنون

hakim22
پنج شنبه 30 فروردین 1397, 19:52 عصر
از اونجایی که اطلاعات Identity کاربر در کوکی مرورگر کش میشه باید کاربر رو خارج کنید تا دوباره بروز رسانی بشه. کلا وجود login بلند مدت از نظر امنیتی مناسب نیست.

Moien Tajik
پنج شنبه 30 فروردین 1397, 19:57 عصر
بطور پیشفرض Authorize از User.IsInRole استفاده میکنه و User هم از کوکی ها استفاده میکنه.
وقتی لاگین میکنید براتون Authentication Ticket ایجاد میشه و اطلاعات کاربر هم داخل Cookie ذخیره میشه.
وقتی به کاربری Role جدیدی اضافه میکنید ، Role در دیتابیس به اون کاربر اضافه میشه و Cookie تغییری نمیکنه.
چون Authorize Filter از Cookie استفاده میکنه ، متوجه نمیشه که Role جدید اضافه شده ; تا وقتی که لاگین کنید و Role های جدید از دیتابیس خونده بشه.

اگر از ASP.NET Core استفاده میکنید ، با استفاده از این دستور میتونید بطور دستی کاری کنید که Cookie ها همراه با Role های جدید ایجاد بشن :

UserManager.UpdateSecurityStampAsync(user)


در ASP.NET MVC 5 این دستور وجود نداره و شما 2 راه برای حل این مشکل دارید :
1- بجای User.IsInRole از UserManager.IsInRole استفاده کنید چون UserManager از دیتابیس میخونه -> پس میتونید فیلتر Authorize سفارشی خودتون که از UserManager استفاده میکنه رو بنویسید :
https://stackoverflow.com/a/26943389/6661314

2- زمان ValidateInterval رو برای Cookie رو کاهش بدید که بعد از مدت کوتاهی Invalid بشه و دوباره با مقادیر جدید از دیتابیس ایجاد بشن :
https://stackoverflow.com/a/36782720/6661314