我正在开发一个MVC6 ASP.Net5项目,并且在登录时持有我的身份验证cookie的.Net Identity遇到了麻烦。
我正在使用自定义用户存储,这是一个包含现有存储过程的现有数据库......
我的SignIn方法是我的User对象的扩展,如下。
public static async Task SignIn(this UserModel Model, UserManager<UserModel> UserManager, SignInManager<UserModel> SignInManager, bool RemeberMe = true)
{
var Claims = new List<Claim>();
Claims.Add(new Claim("UserID", Model.UserID.ToString()));
Claims.Add(new Claim("Username", Model.Username));
await UserManager.AddClaimsAsync(Model, Claims);
await SignInManager.SignInAsync(Model, new AuthenticationProperties { IsPersistent = RemeberMe, AllowRefresh = true });
}
我遇到的问题是即使身份cookie在将来设置了很长时间,在20分钟不活动后,我也被迫重新登录。这让我觉得有些东西是超时的,但我对身份很新,而且我不确定我做错了什么(或者甚至不知道从哪里开始)。
修改 :这是我在自定义用户存储中的自定义GetSecurityStampAsync。我知道这不安全,甚至不做任何事情,但我只想弄清楚现在的问题是什么。我计划在它工作后再重构它。
public Task<string> GetSecurityStampAsync(UserModel user, CancellationToken cancellationToken)
{
return Task.FromResult(user.UserID.ToString() + user.Username);
}
答案 0 :(得分:0)
确保您已根据自己的要求设置了超时时间[s]。 Identity 2.1中有两个超时配置(ExpireTimespan
和ValidateInterval
)可能会影响用户保持登录的时间。您可以使用以下命令配置它们:
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
Provider = new CookieAuthenticationProvider
{
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(15)
},
ExpireTimeSpan = TimeSpan.FromMinutes(30)
});
这在this article中有更多解释 - 有点过时但仍应适用于此时编写的最新版本的ASP.NET Core(rc1)。
如果你正在使用会话,也可能是你的会话正在超时或被清除。
默认情况下,您会获得内存缓存。重新启动进程后,您将丢失会话对象。您需要为会话对象使用持久存储。
如果您正在使用SQL Server,那么这里有一个很好的article可以帮助您入门。