Я хотел бы немного расширить принятый ответ, надеюсь, я смогу сэкономить кому-то немного времени.
В моем случае основной принцип, который я использовал, содержал утверждения, заполненные результатами внешнегосервис, поэтому я хотел кешировать результаты во время входа в систему.
Я создал простой интерфейс кеширования IUserPrincipalCache
и зарегистрировал его в MVC DependencyResolver
.При входе в систему я создаю принципал и добавляю его в кеш.(Поскольку ваша реализация может отличаться, я все это опущу.)
Затем я реализовал это в Global.asax.cs
:
protected void Application_PostAuthenticateRequest(object sender, EventArgs e)
{
if (User.Identity.IsAuthenticated)
{
var cache = DependencyResolver.Current.GetService<IUserPrincipalCache>();
var claimsPrincipal = cache.FindUser(User.Identity.Name);
if (claimsPrincipal != null)
{
Context.User = claimsPrincipal;
Thread.CurrentPrincipal = claimsPrincipal;
}
}
}
Я думаю, что важно отметитьдля IsAuthenticated
, поскольку во многих случаях я мог обойти проверку кэша.Вам также может не потребоваться обновить Thread.CurrentPrincipal
, я думаю, это зависит от того, как вы его используете.