我在登录时添加了一些自定义声明。
private async Task SignInAsync(ApplicationUser user, bool isPersistent)
{
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
var accesses = _roleAccessRepository.GetAssignedAccess(roleId);
foreach (var access in accesses)
{
identity.AddClaim(new Claim("AccessCode", access));
}
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
}
他们工作正常,直到我最近发现在经过一定的不活动后,我假设超过30分钟,这些说法都丢失了。但是,用户仍然登录。
如何在用户仍然登录时重新加载这些声明?
更新:如何发生。
我登录了一个用户,然后在大约30分钟后再次打开它,然后退出了它。它不会被注销,而是刷新了我的页面,没有声明。
答案 0 :(得分:3)
您正面临着SecurityStampValidator
的行动。在VS2013 / VS2015的标准MVC5模板中,有一个文件App_Start\Startup.Auth.cs
包含以下行:
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
// Enables the application to validate the security stamp when the user logs in.
// This is a security feature which is used when you change a password or add an external login to your account.
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
});
您需要查看SecurityStampValidator.OnValidateIdentity
- 此方法每30分钟重新生成一次cookie(默认配置)。并且它不会保留在user.GenerateUserIdentityAsync(manager)
之外添加的声明。
因此,您需要找到ApplicationUser
类并修改GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
方法以包含您的声明。并且不要在其他任何地方添加声明。