Как принудительно распространять изменения ролей среди пользователей с 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))
    }
});

Проблема здесь в том, что веб-сервер кэшировал эти данные. В конце концов, кеш обновится из базы данных, но не сразу. Вот почему есть задержка.

Я думаю, очевидная вещь состоит в том, чтобы переработать пул приложений. Существующие запросы будут продолжены в старом процессе, который завершится после их завершения. Теперь запросы будут идти к новому процессу, который не будет кэшировать данные, и, таким образом, будут читать новые данные из базы данных при первом доступе.

Другие вопросы по тегам