ASP.Net 身份不持久 cookie MVC6 vNext

ASP.Net Identity not persisting cookie MVC6 vNext

我正在处理一个 MVC6 ASP.Net5 项目,但我遇到了 .Net Identity 在登录时保留我的身份验证 cookie 的问题。

我正在使用自定义用户存储,这是一个带有现有存储过程等的现有数据库...

我的 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。

我遇到的问题是,即使身份 cookie 设置了很长时间,但在 20 分钟不活动后,我还是被迫重新登录。这让我觉得有些事情超时了,但我对 Identity 还很陌生,我不确定自己做错了什么(甚至不知道从哪里开始)。

编辑 :这是自定义用户存储中的自定义 GetSecurityStampAsync。我知道这不安全,甚至目前还没有真正做任何事情,但我只是想弄清楚现在的问题是什么。我计划在它工作后重构它。

public Task<string> GetSecurityStampAsync(UserModel user, CancellationToken cancellationToken)
    {
        return Task.FromResult(user.UserID.ToString() + user.Username);
    }

确保您已根据您的要求[s]设置超时。 Identity 2.1 中有两个超时配置(ExpireTimespanValidateInterval)会影响用户可以保持登录状态的时间。您可以使用以下方式配置它们:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
   Provider = new CookieAuthenticationProvider
    {
        OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
            validateInterval: TimeSpan.FromMinutes(15)
    },
    ExpireTimeSpan = TimeSpan.FromMinutes(30)
});

这在 this article 中有更多解释 - 有点过时但仍应适用于撰写本文时发布的最新版本 ASP.NET 核心 (rc1)。

如果您正在使用会话,也可能是您的会话超时或被清除。

默认情况下,您会获得一个内存缓存。一旦进程重新启动,您将丢失会话对象。您需要为会话对象使用持久存储。

如果您正在使用 SQL 服务器,这里有一个很好的 article 可以帮助您入门。