Как принудительно распространять изменения ролей среди пользователей с ASP.NET Identity 2.0.1?
Я прочитал это, и хотя он объясняет, как изменения ролей в конечном итоге распространятся на cookie пользователя через некоторый промежуток времени, я до сих пор не понимаю, как принудительно изменить роли пользователя.
Нужно ли мне выходить из системы, когда я меняю его роль администратора? Если так - как? Если я использую AuthenticationManager.SignOut();
затем я подписываю себя (администратора), а не пользователя, чьи роли я хочу изменить.
В настоящее время я использую await UserManager.UpdateSecurityStampAsync(user.Id);
создать новый штамп безопасности, но он не работает. Когда я обновляю страницу в другом браузере, когда вошел в систему как другой пользователь, его претензии (включая штамп безопасности) не меняются.
2 ответа
Если вы хотите включить немедленный отзыв куки, то каждый запрос должен попадать в базу данных для проверки куки. Таким образом, компромисс между задержкой зависит от загрузки вашей базы данных. Но вы всегда можете установить validationInterval в 0.
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.FromSeconds(0),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
});
Проблема здесь в том, что веб-сервер кэшировал эти данные. В конце концов, кеш обновится из базы данных, но не сразу. Вот почему есть задержка.
Я думаю, очевидная вещь состоит в том, чтобы переработать пул приложений. Существующие запросы будут продолжены в старом процессе, который завершится после их завершения. Теперь запросы будут идти к новому процессу, который не будет кэшировать данные, и, таким образом, будут читать новые данные из базы данных при первом доступе.