为什么安全标记不会注销用户



我正在使用 ASP.NET 身份。当我阻止用户帐户时,它应该立即注销。这是我的代码:

await UserManager.SetLockoutEnabledAsync(user.Id, true);
await UserManager.SetLockoutEndDateAsync(user.Id,DateTime.Today.AddYears(10));
await UserManager.UpdateSecurityStampAsync(user.Id);

Startup.Auth.cs

app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Account/Login"),
                Provider = new CookieAuthenticationProvider
                {
                    OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<AppUserManager, ApplicationUser>(
                    validateInterval: TimeSpan.FromSeconds(0),
                    regenerateIdentity: (manager, user) => manager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie))
                }
            });

但它不会注销用户。我做错了什么?

为什么不使用AuthenticationManager.SignOut()

var authenticationManager= HttpContext.GetOwinContext().Authentication;
authenticationManager.SignOut();

身份验证与 cookie 连接,并且经过身份验证的信息保存在该 cookie 上。Cookie在您设置的时间内有效,无论您做什么,此cookie都会保持用户登录状态,直到过期或从浏览器中删除

您可以从用户浏览器中删除该cookie,但如果由于某种原因他保留了该cookie,则仍然可以登录,直到cookie过期。因此,如果您的用户在 cookie 过期之前已经通过身份验证,则实际登录。

如果您希望立即注销,则需要 不时使用ajax进行一些检查,如果您使用ajax页面,或者在每次页面调用中检查用户的身份验证,或者在数据库上创建一些其他表来保存身份验证cookie,并且只是标记不再有效的表, 并检查每个呼叫。

很抱歉我没有代码向您展示,这是一个复杂的问题,需要您的部分进行设计以满足您的需求和程序

这是我的解决方案:

而不是调用UserManager.UpdateSecurityStampAsync(userId),手动设置安全标记,它会注销用户。

public void UpdateSecurityStamp(string userId)
{
    using (var db = new ApplicationDbContext())
    {
        var user = db.Users.FirstOrDefault(x => x.Id.Equals(userId));
        if (user != null)
        {
            user.SecurityStamp = Convert.ToString(Guid.NewGuid());
            db.SaveChanges();
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新