Я использую Application_OnAuthenticateRequest в Global.asax для назначения настраиваемого участника HttpContext.Current.User и System.Threading.Thread.CurrentPrincipal.
В процессе тестирования я заметил, что этот код выполняется несколько раз для одной страницызапрос.Посмотрев на HttpContext.Current.Request.Url, я определил, что этот код выполняется для каждого вызова файла JavaScript, изображения и файла CSS.Все эти ресурсы хранятся в одной подпапке, которая называется «Контент».Итак, я могу предотвратить многократное выполнение моего пользовательского принципала, проверив, является ли «Content» частью HttpContext.Current.Request.Url следующим образом:
protected void Application_OnAuthenticateRequest(Object sender, EventArgs e)
{
if (HttpContext.Current.Request.Url.AbsoluteUri.Contains("/Content"))
return;
if (Context.User != null)
{
if (Context.User.Identity.IsAuthenticated)
{
var userRepository = ObjectFactory.GetInstance<IUserRepository>();
var prospectorUser = userRepository.GetByUserName(Context.User.Identity.Name);
if (prospectorUser == null)
{
throw new ApplicationException("Context.User.Identity.Name is not a recognised user.");
}
var principal = new ExtendedWindowsPrincipal(HttpContext.Current.User.Identity, prospectorUser);
// Attach the new principal object to the current HttpContext object
HttpContext.Current.User = principal;
// Make sure the Principal's are in sync
System.Threading.Thread.CurrentPrincipal = HttpContext.Current.User;
return;
}
}
}
Мое исправление кажется глупым.Есть ли лучший способ перехватывать запросы для элементов «Содержимое» и предотвращать срабатывание моего пользовательского кода для моего участника для каждого запроса?