c# - ApplicationSignInManager 是否保留成功登录的列表?

标签 c# asp.net-mvc asp.net-identity

我正在使用 ApplicationSignInManager 来验证用户登录(请参阅下面的代码)。 接下来我要做的是防止重复用户同时登录,还要防止超过10个用户同时登录。

我可以维护我自己的当前登录用户集合并引用这个,但我想知道 ApplicationSignInManager 是否自动提供任何类似的功能?

// GET: /Account/Login
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
    ViewBag.ReturnUrl = returnUrl;
    return View();
}


public ApplicationSignInManager SignInManager
{
    get
    {
        return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>();
    }
    private set { _signInManager = value; }
}

//
// POST: /Account/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }

    // This doesn't count login failures towards account lockout
    // To enable password failures to trigger account lockout, change to shouldLockout: true
    var result = await SignInManager.PasswordSignInAsync(model.UserName, 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);
    }
}

最佳答案

ApplicationSignInManager 不进行任何计数,也不在内部跟踪登录用户。它所做的只是为用户创建身份验证 cookie。

您可以通过在创建 cookie 之前为用户重置安全标记来防止并发登录:

var loggedinUser = await UserManager.FindAsync(model.UserName, model.Password);
if (loggedinUser != null)
{
    // Now user have entered correct username and password.
    // Time to change the security stamp
    await UserManager.UpdateSecurityStampAsync(loggedinUser.Id);
}

// do sign-in AFTER we have done the update of the security stamp, so the new stamp goes into the cookie
var result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: false);

更多信息在我的 blog

要限制登录用户数量 - 您必须实现自己的计数。但是您将面临决定“已登录”的实际含义的问题。 IE。打开浏览器选项卡是否算作已登录?如果该选项卡 5 分钟未使用怎么办? 10? 2小时?如果用户在没有点击“注销”的情况下关闭该选项卡怎么办 - cookie 仍然存在,它可能没有过期,但您的应用程序从未收到用户离线的消息。

您需要自己做出这些决定,因为框架中没有任何东西可以为您提供此功能。

关于c# - ApplicationSignInManager 是否保留成功登录的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48189417/

相关文章:

Jquery 数据表显示消息未找到匹配的记录

c# - 在 MVC5 应用程序中注册期间获取附加信息

c# - 将 IdentityServer4 与自定义配置 DBContext 结合使用

c# - 连接到MySql数据库的连接字符串?

c# - 将.net日期格式转换为javascript格式

c# - Entity Framework : query against view in EF (C# code) returns duplicate results

c# - 错误CS1525为什么会发生?

c# - 为什么我的 AJAX 请求没有扩展 OWIN MVC session ?

c# - JwtSecurityTokenHandler 线程安全吗

asp.net-mvc - 从客户端检测到潜在危险的 Request.Form 值