我正在使用 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();
}
}
}