Я пытаюсь ограничить вход пользователя в веб-приложение. Некоторые источники [ 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);
});
Но после того, как я изменил этот код выше, я все равно могу одновременно войти в систему из другого веб-браузера. Я также могу успешно войти в систему с другого компьютера, используя то же имя пользователя и пароль.
- ну, я что-то пропустил?
- Или UpdateSecurityStampAsync нельзя использовать для одновременного входа пользователей в систему?
- Или .Net Core не справляется
этот сценарий и нужна третья сторона для управления пользовательским логином?
Любая помощь / предложение очень важны.