我想做的是将用户ID限制为一次只能登录到一台设备。例如,用户ID“abc”登录到他们的计算机。用户ID“abc”现在尝试从其手机登录。我要发生的是杀死他们计算机上的 session 。

我正在使用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方法,文档说:为用户生成一个新的安全标记,用于SignOutEverywhere功能。但这是行不通的。

最佳答案

如果要在其他设备上启用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))
    }
);

关于c# - ASP.NET MVC身份SecurityStamp签到处无处不在,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36151800/

10-15 08:21