دسته بندی ها
19:17 1399/12/28

جلوگیری از ورود همزمان (لاگین) چند کاربر با یک نام کاربری در Asp.net Core

مشخصات سوال کننده :
کاربر : pedram_khan     امتیاز کاربر : 277     رتبه کاربر : 6
دسته بندی : Asp.net Core

به این سوال امتیاز بدهید    0
تعداد بازدید این سوال : 3207
هوش مصنوعی

پاسخ هوش مصنوعی

برای جلوگیری از ورود همزمان چند کاربر با یک نام کاربری در 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` به مدل کاربر اضافه می کنیم که برای نگهداری شناسه نشست استفاده می شود.
  • قبل از ورود کاربر، بررسی می کنیم که آیا شناسه نشست قبلی وجود دارد یا خیر. اگر وجود داشته باشد و با شناسه جدید مطابقت نداشته باشد، اجازه ورود داده نمی شود.
  • در صورتی که احراز هویت موفقیت آمیز باشد، یک شناسه جدید برای کاربر ایجاد می کنیم و آن را ذخیره می کنیم.

این تنها یک رویکرد برای جلوگیری از ورود همزمان است و ممکن است نیاز به تنظیمات و بهینه سازی های بیشتری به توجه به نیازهای خاص پروژه شما داشته باشد.

به این پاسخ امتیاز بدهید    0
امتیاز: - رتبه: -
پاسخ دهنده : saedbfd 21:04 1399/12/28

جلوگیری از ورود همزمان (لاگین) چند کاربر با یک نام کاربری در Asp.net Core

به صورت پیش فرض توی Asp.net core و Identity هنوز که این پاسخ رو برای شما مینویسم امکانی برای این موضوع فراهم نشده. بنابراین اگر شما میخواهید این کار رو انجام بدید باید به فکر روش خاصی برای انجام این کار باشید. اما خب چند تا راه حل برای این کار وجود داره.

 

کنترل ورود کاربر با استفاده از فیلد کنترلی در دیتابیس

خب یکی از راه حل هایی که خیلیها به فکرشون میرسه این هست که یک فیلد در دیتابیس ایجاد کنیم و هر موقع کاربر لاگین میکنه مثلا مقدارش رو true کنیم. در این حالت اگر کاربر دیگه ای خواست با همین نام کاربری وارد بشه دیگه نمیتونه چون فیلد مورد نظر ما true هست. هنگامی هم که کاربر Log out میکنه مقدار این فیلد رو میتونیم false کنیم.

معایب این روش

در نگاه اول همه چیز خوب هست ولی یک عیب بزرگی این روش داره و اونم این هست که شما فرض کنید کاربر وارد سیستم شد ولی برای خروج روی دکمه Log out کلیک نکرد و یا بعد از اینکه کارشو انجام داد مستقیم مرورگر رو بست . خب در این حالت فیلد کنترلی به صورت true باقی می مونه و خود کاربر اصلی هم دیگه بعدا نمیتونه وارد سیستم بشه. بنابراین این روش غیرقابل استفاده است.

 

تغییر Security Stamp هنگام ورود کاربر

اگر از Identity استفاده می کنید پس مطمئنا با Security Stamp آشنا هستید. یکی از فیلدهایی که در جدول AspNetUsers برای احراز هویت کاربر استفاده میشه همین فیلد هست. شما میتونید هر بار کاربر لاگین میکنه یکبار Security Stamp رو آپدیت کنید و مقدار جدید رو هم در کوکی ذخیره کنید. این روش هم اشکالاتی داره که برای کسب اطلاعات بیشتر و نحوه پیاده سازی میتونید لینک زیر رو مطالعه کنید.

Prevent multiple logins

 

استفاده از پیامک اعتبارسنجی (OTP)

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

 

پیامک اعتبارسنجی در asp

 

همونطوری که میبینید کاربر ابتدا نام کاربری و رمز عبورشو وارد میکنه و سپس تقاضای ارسال کد میکنه و کد برای ارسال میشه. (دقت کنید موقعی که کاربر تقاضای ارسال کد میکنه حتما باید نام کاربری و رمز عبور کاربر کنترل باشه که صحیح باشه و در صورت صحت نام کاربری و رمز عبور پیامک براش ارسال میشه.)

سیستم بانک ملت هم از همین روش داره استفاده میکنه

کنترل جلوگیری از ورود همزمان چند کاربر

 

این روش گرچه هزینه سامانه پیامکی و پیامک داره ولی مطمئن ترین روش هست.

ویرایش شده در پنج شنبه 28 اسفند 1399 ساعت 21:11:57
به این پاسخ امتیاز بدهید    0
امتیاز: 1664 رتبه: 1
1 نظر
rv2021 : سلام به نظر من میشه از از روش فیلد در دیتابیس که مقدار true false استفاده کرد بااین تفاوت که زمان فیلم رو + مثلا 10 دقیقه اضافه تر به کاربر اجازه دسترسی داد و اگر logout نکرده بودبه صورت اتوماتیک مقدار رو تغییر داد .

امتیاز کاربر : 0   رتبه کاربر : 7057   تاریخ ثبت : 12:05 1399/12/29
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود