转换后的用户在 30 分钟后注销

Converted Users are logged out after 30 min

我刚刚将一个 .NET Framework 应用程序转换为 .NET Core。从旧 User-table 导入数据时,SecurityStamp 值是小写的 GUID,例如'0e124deb-8392-4dcc-bce7-38dcc48569a2'。当用户更改密码时,他们会获得一个新的 SecurityStamp。现在它们是大写的,例如'WHBXXXSQEIDVA7KF3T6AJJJ3AHWWUSYE'.

使用新的SecurityStamp 的用户没有任何问题。我应该只擦除用户 table 中的 SecurityStamp 列吗?用户下次登录时是否创建了新的SecurityStamp?我很难找到有关此级别身份的文档。

仅当用户更改密码或取消与外部登录的链接时,才会创建新的安全标记。 默认情况下,Cookie 的验证时间间隔为 30 分钟。由于您使用的是最新的 .net-core 版本,您可以在 startup.cs 中的 ConfigureServices() 中使用以下代码片段来延长验证时间。

如果时间设置为 0 它将在每个请求中验证


services.Configure<SecurityStampValidatorOptions>(options =>
{
    // This is the key to control how often validation takes place
    options.ValidationInterval = TimeSpan.FromMinutes(30);
});

注意: UserManager 允许您使用该方法更新您的安全标记 userManager.UpdateSecurityStampAsync(user)。如果您在登录后使用它,验证很可能会失败。

最后,如果你想以自己的方式处理这个行为,你可以在中间件中编写自己的验证器和接线


services.AddAuthentication(options =>
{
  options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
  options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
  options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
}).AddCookie(options =>
 {
    options.Events.OnValidatePrincipal = LastChangedValidator.ValidateAsync;
 });


public static class LastChangedValidator
{
    public static async Task ValidateAsync(CookieValidatePrincipalContext context)
    {
       // you can use your own logic 

       /* var userRepository = context.HttpContext.RequestServices.GetRequiredService<IUserRepository>();
        var userPrincipal = context.Principal;

        // Look for the last changed claim.
        string lastChanged;
        lastChanged = (from c in userPrincipal.Claims
                       where c.Type == "LastUpdated"
                       select c.Value).FirstOrDefault();

        if (string.IsNullOrEmpty(lastChanged) ||
            !userRepository.ValidateLastChanged(userPrincipal, lastChanged))
        {
            context.RejectPrincipal();
            await context.HttpContext.Authentication.SignOutAsync("MyCookieMiddlewareInstance");
        } */
    }
}

否则您可以通过使用以下

重写该方法来处理 ValidatePrincipal()

public class CustomCookieHandler: CookieAuthenticationEvents
{
  public override Task ValidatePrincipal(CookieValidatePrincipalContext context)
  {
    return base.ValidatePrincipal(context);
  }
}