Как предотвратить многократный и одновременный вход в систему .Net Core 2.x? - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь ограничить вход пользователя в веб-приложение. Некоторые источники [ 1 ] & [ 2 ] используют ту же идею, используя await _userManager.UpdateSecurityStampAsync (loginUser);

Это полный код Действие входа в AccountController:

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Login (LoginViewModel model, string returnUrl = null) {
        ViewData["ReturnUrl"] = returnUrl;
        if ( ModelState.IsValid ) {

            var loginUser = await _userManager.FindByEmailAsync(model.Email);
            if ( loginUser == null ) {
                ModelState.AddModelError (string.Empty, "Invalid username/password.");
                return View ();
            }

            await _userManager.UpdateSecurityStampAsync (loginUser);
            var result = await _signInManager.PasswordSignInAsync(loginUser, model.Password, isPersistent: false, lockoutOnFailure: true);

            if ( result.Succeeded ) {
                _logger.LogInformation ("User logged in.");
                return RedirectToLocal (returnUrl);
            }
            if ( result.RequiresTwoFactor ) {
                return RedirectToAction (nameof (LoginWith2fa), new { returnUrl, model.RememberMe });
            }
            if ( result.IsLockedOut ) {
                _logger.LogWarning ("User account locked out.");
                return RedirectToAction (nameof (Lockout));
            } else {
                ModelState.AddModelError (string.Empty, "Invalid login attempt.");
                return View (model);
            }
        }

        // If we got this far, something failed, redisplay form
        return View (model);
    }

Вышеуказанное действие входа выглядит так знакомо. Он просто изменен путем добавления UpdateSecurityStampAsync для обновления столбцов 'concurrencyStamp' и 'SecurityStamp' в таблице (dbo.AspNetUsers) при каждом входе пользователя в систему до PasswordSignInAsync .

Я пытался снимать с экрана два разных браузера (1-я и 2-я попытки из Chrome; 3-я и 4-я попытка из Firefox) с тем же логином. 2 и 4 были захвачены после выполнения UpdateSecurityStampAsync . 2-й и 3-й имели одинаковые ConcurrencyStamp и SecurityStamp .

Я также изменил файл start.cs в методе ConfigureServices:

        services.Configure<SecurityStampValidatorOptions> (option =>
            option.ValidationInterval = TimeSpan.FromSeconds (0)
        );

        services.AddAuthentication ()
            .Services.ConfigureApplicationCookie (options => {
                options.SlidingExpiration = true;
                options.ExpireTimeSpan = TimeSpan.FromMinutes (30);
        });

Но после того, как я изменил этот код выше, я все равно могу одновременно войти в систему из другого веб-браузера. Я также могу успешно войти в систему с другого компьютера, используя то же имя пользователя и пароль.

  1. ну, я что-то пропустил?
  2. Или UpdateSecurityStampAsync нельзя использовать для одновременного входа пользователей в систему?
  3. Или .Net Core не справляется этот сценарий и нужна третья сторона для управления пользовательским логином?

Любая помощь / предложение очень важны.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...