转换后的用户在 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);
}
}
我刚刚将一个 .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);
}
}