Я пытаюсь заблокировать несколько логинов с одним и тем же пользователем в своем приложении.
Моя идея - обновить штамп безопасности при входе пользователя и добавить его в качестве претензии, а затем в каждом отдельном запросе, сравнивая штамп с куки файлом с таковым в базе данных. Вот как я реализовал это:
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 пользователя, которое я не могу понять, почему? Я подозрительно, может быть, новый обновленный штамп безопасности не сохраняется в пользовательском cookie?