我想要做的是将用户ID限制为只能一次登录到一个设备。例如,用户ID“abc”登录到他们的计算机。用户ID“abc”现在尝试从手机登录。我想要发生的是在他们的计算机上杀死会话。
我正在使用Asp.net mvc身份会员资格并使用SecurityStamp来实现此目的。这是我在帐户/登录操作中的代码:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
var user = UserManager.FindByEmail(model.Email);
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
await UserManager.UpdateSecurityStampAsync(user.Id);
根据UpdateSecurityStampAsync
方法doc说:为用户生成一个新的安全标记,用于SignOutEverywhere功能。但它不起作用。
答案 0 :(得分:3)
如果要在其他设备上启用cookie的即时失效,则每个请求都必须访问数据库以验证cookie。为此,您需要在Auth.Config.cs中配置cookie失效并将validateInterval设置为0:
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
Provider = new CookieAuthenticationProvider
{
// Enables the application to validate the security stamp when the user logs in.
// This is a security feature which is used when you change a password or add an external login to your account.
OnValidateIdentity = SecurityStampValidator
.OnValidateIdentity<UserManager, ApplicationUser>(
validateInterval: TimeSpan.FromSeconds(0),
regenerateIdentityCallback: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
);