Application_OnAuthenticateRequest выполняется для запросов изображения - PullRequest
4 голосов
/ 23 августа 2010

Я использую 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;
        }
    }
}

Мое исправление кажется глупым.Есть ли лучший способ перехватывать запросы для элементов «Содержимое» и предотвращать срабатывание моего пользовательского кода для моего участника для каждого запроса?

Ответы [ 2 ]

0 голосов
/ 23 августа 2010

Событие AuthenticateRequest происходит довольно высоко в HTTP-конвейере.Если вы хотите обойти это в некоторых случаях для своего приложения, вам, вероятно, потребуется написать HttpModule, зарегистрированный для обработки заданного пути.

Посмотрите на рисунки 9, 10 и 11 встатья ниже.Вы должны быть в состоянии следовать за ним, чтобы создать собственный модуль для обработки запросов к пути к контенту и обойти всю обычную обработку событий.

Безопасное внедрение обработки запросов, фильтрации и перенаправления контента с помощью конвейеров HTTPв ASP.NET

0 голосов
/ 23 августа 2010

Простой ответ - изменить ваш web.config, чтобы сделать папку «Content» анонимно доступной:

<location path="Content">
    <system.web>
        <authorization>
            <allow users ="*" />
        </authorization>
    </system.web>
</location>
...