Проблемы ASP.NET HttpModules и Server.Transfer / Server.TransferRequest / RewritePath

Я постараюсь быть максимально конкретным. Я унаследовал очень устаревший фильтр ISAPI C ++, который защищает классический веб-сайт ASP, и мне было поручено создать HTTPModule для его непосредственной замены.

Сначала я подключился к событию OnPreRequestHandlerExecute. Затем я успешно воссоздал вызовы сохраненных процедур, которые выполнял исходный фильтр ISAPI. Эти вызовы возвращают код состояния, который я вставляю в оператор CASE и, в зависимости от кода состояния, устанавливаю строковую переменную «перенаправления» (sUrl). Например, statusCode 15 установит sUrl в "/Session/Login.asp". Все это успешно работает.

Следующим шагом является собственно «перенаправление» страницы. В C ++ модуль делал следующее:

Headers.push_back(HeadersList::value_type("url", "/Session/Errors/SecurIDRequired.asp"));

Я пытаюсь воссоздать эту функциональность, используя следующее:

HttpContext.Current.RewritePath(sUrl);

Это работает на 100% для всех классических asp-страниц. Проблема возникает, когда пользователь пытается получить доступ к "http://somedomain.com/Blah.jpg Модуль успешно запускается, устанавливает правильный statusCode 15 и вызывается метод RewritePath, но не перезаписывает URL-адрес страницы входа.То же самое происходит с любой неклассической страницей ASP.

Поэтому я начал искать другие варианты вместо RewritePath и посмотрел на TransferRequest. Это выглядело многообещающе, поэтому я изменил код на:

HttpContext.Current.Server.TransferRequest(sUrl, true);

Теперь это направляет все запрошенные типы файлов на страницу входа, но происходят странные вещи. Во-первых, я получаю следующие ошибки на стороне клиента в FireBug:

синтаксическая ошибка https://somedomain.com/JS/jQuery/jquery.js Line 2

... некоторые другие ошибки javascript, связанные с jQuery. Я смотрю на панель Net, и она успешно загрузила библиотеку jQuery, поэтому я затрудняюсь с этим (этого не происходит с методом RewritePath).

Наконец, я попытался использовать старый добрый Server.Transfer и получил эту ошибку на стороне сервера:

Для типа запроса GET обработчик http не найден.

Фух! Надеюсь, мое объяснение было адекватным :)

Я предполагаю, что мой настоящий вопрос заключается в том, как лучше всего достичь того, что я пытаюсь достичь. Мне кажется, что метод RewritePath - лучший, любые советы будут очень признательны.

Ваше здоровье!

РЕДАКТИРОВАТЬ:

Обработчики, содержащиеся в файле web.config, следующие:

<httpHandlers>
    <remove verb="*" path="*.asmx" />
    <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add verb="GET,HEAD" path="ScriptResource.axd" validate="false" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</httpHandlers>

person nokturnal    schedule 12.02.2010    source источник
comment
Если я могу перефразировать ваш вопрос, вы спрашиваете, как лучше всего защитить статические / нестатические ресурсы, чтобы пользователям всегда приходилось входить в систему, когда они пытаются получить доступ к ресурсу?   -  person ram    schedule 13.02.2010
comment
Кстати, можете ли вы упомянуть, какую версию IIS вы используете?   -  person ram    schedule 13.02.2010


Ответы (3)


Я не знаю, лучший ли это способ, но в качестве теста работает ли что-то вроде следующего?

В вашем HttpModule:

private void Application_BeginRequest(Object source, EventArgs e)
{
    HttpContext context = ((HttpApplication)source).Context;
    HttpRequest request = context.Request;
    if(request.Url.ToString().Contains("blah.jpg"))
    {
        context.RewritePath("~/login.aspx?");
    }
}
person TK-421    schedule 12.02.2010
comment
Это было бы переписывание на классическую страницу ASP, а не на ресурс ASPX. Кроме того, если я использую событие BeginRequest, я получаю те же клиентские ошибки, что и при использовании метода Server.Transfer. - person nokturnal; 13.02.2010

Похоже, что IIS не передает запросы на изображения в ASP.Net, который используется по умолчанию (IIS просто обслуживает изображения, обычно не передавая их на страницу или что-то еще).

Вы пробовали сопоставить расширения изображений со своим пользовательским обработчиком в IIS или с помощью файла web.config?

person womp    schedule 12.02.2010
comment
Не уверен, но nokturnal упомянул любую неклассическую страницу ASP, поэтому я предполагаю, что это означает, что запросы .aspx также не работают правильно. - person TK-421; 12.02.2010
comment
Тот же случай. Для меня это попахивает проблемами обработчика. Если он обновляет классический сайт asp, настройки обработчика могут отсутствовать и для .aspx. - person womp; 13.02.2010
comment
Файлы сайта были перемещены на новый сайт IIS7 (который, очевидно, использует режим интегрированного конвейера). - person nokturnal; 13.02.2010
comment
Итак, вы проверили сопоставления обработчиков? - person womp; 13.02.2010
comment
Прямо сейчас на пути домой. Я постараюсь проверить это, когда приеду. Спасибо большое, ребята, это меня действительно беспокоит :) - person nokturnal; 13.02.2010
comment
WOMP, пожалуйста, просмотрите мою правку выше, чтобы увидеть обработчики, содержащиеся в web.config › - person nokturnal; 13.02.2010
comment
Хорошо, выглядит хорошо ... Можете ли вы проверить настройки администратора IIS, чтобы убедиться, что есть настройки и для обработчиков ASPX? Перейдите в веб-приложение и проверьте настройки обработчика ... - person womp; 13.02.2010
comment
Извините за задержку, но я не вернусь до воскресенья, ребята. Спасибо за интерес к теме и спасибо за помощь в этом вопросе! - person nokturnal; 13.02.2010
comment
Эта проблема вернулась, чтобы укусить меня за задницу, поэтому мне пришлось вернуться к этой теме :) womp, я посмотрел настройки IIS7, и для обработчиков для .ASPX перечислены следующие: PageHandlerFactory-ISAPI-2.0-64, PageHandlerFactory -ISAPI-2.0, PageHandlerFactory-ISAPI-4.0_32bit + 64bit сопоставление с C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ aspnet_isapi.dll PageHandlerFactory-Integrated-4.0, PageHandlerFactory-Integrated сопоставление с System.Web.UI. PageHandlerFactory ... Это вообще помогает? - person nokturnal; 07.09.2010

Приятель, мне так жаль, что я зря трачу время.

Оказывается, в базовой структуре данных были проблемы (права были установлены неправильно). Из-за сложности реализованной модели безопасности я, должно быть, упускал это снова и снова, пока, наконец, не осознал проблему. Я, должно быть, 100 раз смотрел на это и не осознавал этого!

Спасибо за все ответы и еще раз извините, ребята.

person nokturnal    schedule 13.09.2010
comment
Поскольку я не мог удалить этот вопрос, я выбрал его в качестве ответа, чтобы пользователям не приходилось читать все ответы и все комментарии, чтобы понять, что я идиот. - person nokturnal; 28.05.2016