在浏览器关闭时更新数据库 [英] Update database on browser closing
本文介绍了在浏览器关闭时更新数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试限制用户一次登录多台计算机。为此,我在登录时将数据库中某个字段的值更改为1
,并在AccountController
的LogOff()
方法中将其重置为0
。
我希望用户在浏览器关闭时自动注销,因此我将inPersistent = false
设置为如下:
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
问题是,当浏览器关闭时,LogOff()
方法不会被调用,并且我无法将值重置为0。由于该字段尚未重置为0,该用户将无法再次登录。
如何在关闭浏览器时更新数据库并将该字段重置为0?
推荐答案
虽然这不能回答您有关浏览器关闭的问题,但使用标识SecurityStamp
可以解决此问题。
用户登录时,您可以强制更新SecurityStamp
,这将使任何其他有效的Cookie无效,并允许用户一次只能登录一台计算机。
This answer完美地解释了SecurityStamp
。
因此,SecurityStamp
的主要目的是随时随地启用注销。其基本思想是,无论何时更改用户上与安全相关的内容,如密码,最好自动使Cookie中的任何现有登录无效,这样,如果您的密码/帐户以前被泄露,攻击者将不再拥有访问权限。 在2.0.0中,我们添加了以下配置以挂接 CookieMiddleware中的OnValidateIdentity
方法查看SecurityStamp
并在更改时拒绝Cookie。它还 每隔一天自动刷新数据库中的用户声明 如果图章保持不变(它负责处理事情),则为刷新间隔 如角色转换等)
如果这是您要走的路线;this answer在详细信息中准确地说明了如何实现您要实现的目标(最终结果)。
我将为Clarity提供该帖子的源代码。
基本上您的登录方法如下所示。
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (!ModelState.IsValid)
{
return View(model);
}
// check if username/password pair match.
var loggedinUser = await UserManager.FindAsync(model.Email, model.Password);
if (loggedinUser != null)
{
// change the security stamp only on correct username/password
await UserManager.UpdateSecurityStampAsync(loggedinUser.Id);
}
// do sign-in
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
switch (result)
{
case SignInStatus.Success:
return RedirectToLocal(returnUrl);
case SignInStatus.LockedOut:
return View("Lockout");
case SignInStatus.RequiresVerification:
return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
case SignInStatus.Failure:
default:
ModelState.AddModelError("", "Invalid login attempt.");
return View(model);
}
}
并且您将在Startup.Auth.cs
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
// other stuff
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(0), // <-- Note the timer is set for zero
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
});
这篇关于在浏览器关闭时更新数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文