我正在使用 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/