我有一个Web应用程序,员工可以登录以执行工作。我要达到的目的是:当用户从计算机登录时,如果他已经在另一台计算机上登录,则必须注销该用户。该Web应用程序首先是MVC Asp.Net Core 2.2代码。我在启动时添加了signInManager并编辑了PasswordSignInAsync方法。我从两个不同的设备登录系统。当我从登录的第一台计算机上单击屏幕上的某项时,它将重定向到注销。好像在工作。但是我不确定这是否是正确的方法。我添加的代码是:await UserManager.UpdateSecurityStampAsync(user);内部的PasswordSignInAsync方法。
在我添加的启动类ConfigureServices方法内
'services.AddIdentity<ApplicationUser, ApplicationRole>()
.AddSignInManager<SignInManagerX>()'
然后在从SignInManager继承的SignInManagerX类中,我重写了PasswordSignInAsync
public override async Task<SignInResult>
PasswordSignInAsync(ApplicationUser user, string password,
bool isPersistent, bool lockoutOnFailure)
{
if (user == null)
{
throw new ArgumentNullException(nameof(user));
}
var attempt = await CheckPasswordSignInAsync(user, password,
lockoutOnFailure);
//Here is added
if (attempt.Succeeded)
{
await UserManager.UpdateSecurityStampAsync(user);
}
//Add end
return attempt.Succeeded
? await SignInOrTwoFactorAsync(user, isPersistent)
: attempt;
}
这是正确的方法吗?或者如果用户已经在另一个Ip上登录,我应该向登录数据库添加一个表来保存信息。然后,如果最后一次和当前的登录尝试为true,则从所有计算机注销该用户?
答案 0 :(得分:0)
是的,SecurityStamp
的主要目的是允许在任何地方注销。
基本思想是,每当用户更改与安全性相关的某些内容(例如密码)时,最好自动使任何现有的登录Cookie失效,因此,如果您的密码/帐户先前遭到破坏,则攻击者不再有访问权限。
参考:https://stackoverflow.com/a/19505060/5751404
您可以将validateInterval
设置为TimeSpan.Zero
以便立即注销。