Я пытаюсь заблокировать несколько логинов с одним и тем же пользователем в своем приложении.
Моя идея - обновить штамп безопасности при входе пользователя и добавить его в качестве претензии, а затем в каждом отдельном запросе, сравнивая штамп с куки-файлом с таковым в базе данных. Это, как я реализовал, что:Предотвращение нескольких логинов
public virtual async Task<ActionResult> Login([Bind(Include = "Email,Password,RememberMe")] LoginViewModel model, string returnUrl)
{
if (!ModelState.IsValid)
{
return View(model);
}
SignInStatus result =
await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, false);
switch (result)
{
case SignInStatus.Success:
var user = UserManager.FindByEmail(model.Email);
var id = user.Id;
UserManager.UpdateSecurityStamp(user.Id);
var securityStamp = UserManager.FindByEmail(model.Email).SecurityStamp;
UserManager.AddClaim(id, new Claim("SecurityStamp", securityStamp));
Затем в конфигурации аутентификации Я добавил
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
OnValidateIdentity = ctx =>
{
var ret = Task.Run(() =>
{
Claim claim = ctx.Identity.FindFirst("SecurityStamp");
if (claim != null)
{
var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
var user = userManager.FindById(ctx.Identity.GetUserId());
// invalidate session, if SecurityStamp has changed
if (user != null && user.SecurityStamp != null && user.SecurityStamp != claim.Value)
{
ctx.RejectIdentity();
}
}
});
return ret;
}
}
});
Как показывает я пытался сравнить претензии от печенья с одной в базе и отклонять личность, если они не совпадают.
Теперь, каждый раз, когда пользователь подписывается в марке безопасности, обновляется, но значение отличается от cookie пользователя, которое я не могу понять, почему? Я подозрительно, может быть, новая обновленная марка безопасности не будет храниться в cookie пользователя?
Я думаю, что ваш подход является слишком сложным. Я сделал подобное. Создайте статический класс со статическим списком 'CurrentUsers'. Когда пользователь входит в систему, проверьте этот список. Отклонить, если текущий. Сложное решение - это то, что событие означает удаление пользователей для «CurrentUsers». Очевидно, что выход из системы был причиной. Но вы хотите, чтобы пользователь сохранил файл cookie, но удалил их как текущий, когда сеансы запуска переработаны (соединение браузера завершается)? В этом случае в методе 'Session_OnEnd()' вы должны удалить пользователя из 'CurrentUsers'. –