在浏览器关闭时更新数据库 [英] Update database on browser closing

查看:0
本文介绍了在浏览器关闭时更新数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试限制用户一次登录多台计算机。为此,我在登录时将数据库中某个字段的值更改为1,并在AccountControllerLogOff()方法中将其重置为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

中更新您的ConfigureAuth方法
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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆