Estou usando ApplicationSignInManager
para autenticar logins de usuários (veja o código abaixo). O que desejo fazer a seguir é evitar que usuários duplicados façam login ao mesmo tempo e também evitar que mais de 10 usuários façam login simultaneamente.
Eu poderia manter minha própria coleção de quais usuários estão atualmente logados e referir-me a isso, mas gostaria de saber se ApplicationSignInManager
oferece alguma funcionalidade como essa automaticamente?
// 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
não faz nenhuma contagem e não rastreia internamente os usuários conectados. Tudo o que ele faz é criar um cookie de autenticação para o usuário.
Você pode evitar logins simultâneos redefinindo o carimbo de segurança para um usuário antes de criar um 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);
Mais sobre isso no meu blog
Para ter um número limitado de usuários logados - você terá que implementar sua própria contagem. Mas você enfrentará um problema ao decidir o que realmente significa "conectado". Ou seja, ter uma guia aberta do navegador conta como conectado? e se essa guia não for usada por 5 minutos? 10? 2 horas? E se o usuário fechasse essa guia sem clicar em "Logout" - o cookie ainda está lá, provavelmente não expirou, mas seu aplicativo nunca recebeu uma mensagem de que o usuário estava offline.
Você precisará tomar essas decisões sozinho, pois não há nada na estrutura que fornecerá essa funcionalidade.
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras