جلوگیری از ورود همزمان (لاگین) چند کاربر با یک نام کاربری در Asp.net Core
سلام دوستان . یک پروژه دارم که هر کاربر میتونه توی اون محصولات مورد نیاز خودش رو که فیلم هستن رو خریداری کنه و از طریق پنل کاربری فیلم ها رو مشاهده کنه. اما اخیرا مشاهده شده که بعضی از کاربرها با یک اکانت وارد میشن و همه از یک اکانت استفاده میکنن. جهت جلوگیری از ورود همزمان (لاگین) چند کاربر با یک نام کاربری در Asp.net Core چه راهکارهایی هست ؟
پاسخ هوش مصنوعی
برای جلوگیری از ورود همزمان چند کاربر با یک نام کاربری در ASP.NET Core، می توانید از روش های مختلفی استفاده کنید. یکی از رایج ترین روش ها نگهداری یک شناسه نشست (Session ID) در هر بار ورود کاربر است و در صورت ورود دوباره، شناسه های جدید را با شناسه قبلی مقایسه کنید و از ورود جدید جلوگیری کنید.
در زیر یک مثال ساده برای پیاده سازی این مفهوم آورده شده است:
CSharp
public class LoginService
{
private readonly UserManager _userManager;
private readonly SignInManager _signInManager;
private readonly IHttpContextAccessor _httpContextAccessor;
public LoginService(UserManager userManager, SignInManager signInManager, IHttpContextAccessor httpContextAccessor)
{
_userManager = userManager;
_signInManager = signInManager;
_httpContextAccessor = httpContextAccessor;
}
public async Task LoginAsync(LoginViewModel model)
{
var user = await _userManager.FindByNameAsync(model.Username);
if (user != null && await _userManager.CheckPasswordAsync(user, model.Password))
{
var sessionId = _httpContextAccessor.HttpContext.Session.GetString("SessionId");
if (sessionId != null && sessionId != user.SessionId)
{
// کاربر دیگری در حال ورود با این نام کاربری است
return false;
}
user.SessionId = Guid.NewGuid().ToString(); // ایجاد یک شناسه جدید
await _userManager.UpdateAsync(user);
await _signInManager.SignInAsync(user, isPersistent: model.RememberMe);
return true;
}
return false;
}
}
در اینجا:
- ما یک فیلد به نام `SessionId` به مدل کاربر اضافه می کنیم که برای نگهداری شناسه نشست استفاده می شود.
- قبل از ورود کاربر، بررسی می کنیم که آیا شناسه نشست قبلی وجود دارد یا خیر. اگر وجود داشته باشد و با شناسه جدید مطابقت نداشته باشد، اجازه ورود داده نمی شود.
- در صورتی که احراز هویت موفقیت آمیز باشد، یک شناسه جدید برای کاربر ایجاد می کنیم و آن را ذخیره می کنیم.
این تنها یک رویکرد برای جلوگیری از ورود همزمان است و ممکن است نیاز به تنظیمات و بهینه سازی های بیشتری به توجه به نیازهای خاص پروژه شما داشته باشد.
جلوگیری از ورود همزمان (لاگین) چند کاربر با یک نام کاربری در Asp.net Core
به صورت پیش فرض توی Asp.net core و Identity هنوز که این پاسخ رو برای شما مینویسم امکانی برای این موضوع فراهم نشده. بنابراین اگر شما میخواهید این کار رو انجام بدید باید به فکر روش خاصی برای انجام این کار باشید. اما خب چند تا راه حل برای این کار وجود داره.
کنترل ورود کاربر با استفاده از فیلد کنترلی در دیتابیس
خب یکی از راه حل هایی که خیلیها به فکرشون میرسه این هست که یک فیلد در دیتابیس ایجاد کنیم و هر موقع کاربر لاگین میکنه مثلا مقدارش رو true کنیم. در این حالت اگر کاربر دیگه ای خواست با همین نام کاربری وارد بشه دیگه نمیتونه چون فیلد مورد نظر ما true هست. هنگامی هم که کاربر Log out میکنه مقدار این فیلد رو میتونیم false کنیم.
معایب این روش
در نگاه اول همه چیز خوب هست ولی یک عیب بزرگی این روش داره و اونم این هست که شما فرض کنید کاربر وارد سیستم شد ولی برای خروج روی دکمه Log out کلیک نکرد و یا بعد از اینکه کارشو انجام داد مستقیم مرورگر رو بست . خب در این حالت فیلد کنترلی به صورت true باقی می مونه و خود کاربر اصلی هم دیگه بعدا نمیتونه وارد سیستم بشه. بنابراین این روش غیرقابل استفاده است.
تغییر Security Stamp هنگام ورود کاربر
اگر از Identity استفاده می کنید پس مطمئنا با Security Stamp آشنا هستید. یکی از فیلدهایی که در جدول AspNetUsers برای احراز هویت کاربر استفاده میشه همین فیلد هست. شما میتونید هر بار کاربر لاگین میکنه یکبار Security Stamp رو آپدیت کنید و مقدار جدید رو هم در کوکی ذخیره کنید. این روش هم اشکالاتی داره که برای کسب اطلاعات بیشتر و نحوه پیاده سازی میتونید لینک زیر رو مطالعه کنید.
استفاده از پیامک اعتبارسنجی (OTP)
روشهای بالا همگی مشکلاتی دارن و اشکالات زیادی رو ممکنه برای شما به وجود بیارن. روشی که امروزه خیلی استفاده میشه و تقریبا خیلی از بانکها هم از همین روش استفاده میکنن (مثل اینترنت بانک ملت) استفاده از روش پیامک اعتبارسنجی هست. در این روش شما باید شماره تماس کاربرانتون رو داشته باشید. هر موقع کاربر خواست وارد سیستم بشه نام کاربری و رمز عبورشو وارد میکنه و یک پیامک براش ارسال میشه که فقط توسط اون پیامک میتونه وارد سیستم بشه. خب در این روش دیگه کاربران نمیتونن با یک اکانت وارد سیستم بشن. چون پیامک فقط برای صاحب اکانت ارسال میشه. بنظر میرسه بهترین روش در حال حاضر همین روش هست چرا که خیلی از سایتهای هم از این روش دارن استفاده میکنن. این روش رو برای این سایت پیاده سازی کردم قبلا و تقریبا راضی هستن.
همونطوری که میبینید کاربر ابتدا نام کاربری و رمز عبورشو وارد میکنه و سپس تقاضای ارسال کد میکنه و کد برای ارسال میشه. (دقت کنید موقعی که کاربر تقاضای ارسال کد میکنه حتما باید نام کاربری و رمز عبور کاربر کنترل باشه که صحیح باشه و در صورت صحت نام کاربری و رمز عبور پیامک براش ارسال میشه.)
سیستم بانک ملت هم از همین روش داره استفاده میکنه
این روش گرچه هزینه سامانه پیامکی و پیامک داره ولی مطمئن ترین روش هست.
- آموزش استفاده از پلاگین گردونه شانس در Asp.net core به همراه سورس
- نمایش متن به صورت فرمت شده در CkEditor
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- خطای 500 زمان اجرا شدن پروژه روی هاست
- کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
- کار با CkEditor با قابلیت آپلود عکس
- خطا در ایجاد migration در Asp.net core
- تفاوت های Asp.net core و Asp.net mvc چیه؟
- دلیل اسپم شدن ایمیل های ارسالی از سرور
- نحوه لایه بندی پروژه Core و اضافه کردن به IIS
- ارسال ایمیل در Asp.net core
- آیا میشه در mvc core از کامپونت استفاده کرد
- آپلود فایل در Asp.net core چگونه است؟
- حذف کامل یک رکورد در جدول ریلیشن شده
- اشکال در آپلود فایل ویدیو در mvc core 2