ASP.NET 身份 2 记住我 - 用户正在注销
本文关键字:用户 注销 记住我 NET 身份 ASP | 更新日期: 2023-09-27 18:36:15
我在我的MVC5应用程序中使用Identity 2.1。我正在将 PasswordSignInAsync 的 isPersistent 属性设置为 true 以启用"记住我":
var result = await SignInManager.PasswordSignInAsync(model.Username,
model.Password,
true,
shouldLockout: false);
但是,如果我在一夜之间保持登录状态,那么当我早上刷新页面时,它会将我注销,我必须再次登录。在用户手动注销之前,如何防止自动注销?
这与身份使用的 Cookie 身份验证有关吗?我不太了解在Startup.Auth.cs中设置的CookieAuthenticationOptions。
new CookieAuthenticationProvider
{
OnValidateIdentity = SecurityStampValidator
.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user)
=> user.GenerateUserIdentityAsync(manager))
}
我认为你应该阅读这篇文章.有两种不同的间隔:ValidateInterval
和ExpireTimeSpan
。在您的情况下,我认为您应该更改expireTimeSpan
,而不是ValidateInterval
.
在类似的问题中TimeSpan
参数有一个解释。只需使用无限的 cookie,如下所示:
OnValidateIdentity = SecurityStampValidator
.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(0),
regenerateIdentity: (manager, user)
=> user.GenerateUserIdentityAsync(manager))
这也是它正常工作所必需的:
叫
await UserManager.UpdateSecurityStampAsync(userId);
以前
AuthenticationManager.SignOut();
在这篇文章中,isPersistent
参数设置身份验证会话是否在多个请求中持久化。
我遇到了这个问题。 这是由于我的自定义用户商店没有实现IUserSecurityStampStore引起的。
public Task<string> GetSecurityStampAsync(IdentityUser user)
{
return Task.FromResult<string>(user.SecurityStamp);
}
如果没有安全标记,SecurityStampValidator 将没有要验证的内容,因此注销用户。
我应该写更多。这个奇怪的代码:
OnValidateIdentity = SecurityStampValidator
.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(0),
regenerateIdentity: (manager, user)
=> user.GenerateUserIdentityAsync(manager))
导致我的应用程序在 1 天后丢失 cookie。我真的不知道为什么,但是在排除此代码并向我的 web.config 添加 mashine 密钥后,"记住我"的未来终于正常工作了。
我当前的代码是:
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
ExpireTimeSpan = TimeSpan.FromDays(5)
});