Найти причину перенаправления в ASP.NET? - PullRequest
5 голосов
/ 18 ноября 2008

Я пытаюсь вставить исключение в мой файл web.config, чтобы одна страница не требовала аутентификации. Тем не менее, он все еще перенаправляет на страницу входа.

Вопрос не в том, как настроить web.config . Зачем? Наша система (к лучшему или к худшему) имеет множество инструментов помимо web.config. У нас есть global.asax и пользовательские HttpHandlers. База кода невелика, но существует много потенциальных причин для перенаправления.

Что я хочу знать, так это , как наилучшим образом определить причину перенаправления . Есть ли способ узнать, какой код вызвал перенаправление?

Ответы [ 5 ]

4 голосов
/ 18 ноября 2008

Если вы можете отлаживать приложение, начиная с HttpApplication.BeginRequest в global.asax и , проходя через справочный источник System.Web , будет методом грубой силы.

В качестве альтернативы, установите точку останова на HttpResponse.Redirect (string, bool) и следуйте стеку вызовов - я сомневаюсь, что есть и другие способы, которые среда выполнения использует для перенаправления запроса.

Если это ничего не дает (или вы не можете отладить), и поскольку метод грубой силы, вероятно, проведет через большой объем кода - и, похоже, ваша проблема связана с безопасностью - вы, вероятно, можете просто перехватить HttpApplication. AuthenticateRequest и HttpApplication. AuthorizeRequest (и связанные с ним события Post *) и просмотр того, как все выглядит там.

Если вы используете проверку подлинности с помощью форм, я случайно узнаю, что FormsAuthenticationModule ищет код состояния 401 в HttpApplication.EndRequest, чтобы решить, следует ли перенаправить запрос. Все, что устанавливает 401 (доступ запрещен), приведет к перенаправлению, а не к 401, возвращаемому в браузер.

1 голос
/ 18 ноября 2008

Кроме того, если это происходит только в вашем производственном приложении, вы можете узнать, что происходит с помощью WinDBG. Слегка следуя этой статье , вы сделаете следующее:

  • Запустите WinDBG и подключитесь к процессу w3wp
  • WinDBG будет работать с точкой останова, поэтому .loadby sos mscorwks будет загружать модуль SOS
  • введите sxe clr для точки останова при исключениях CLR
  • введите g, чтобы продолжить

Теперь ваше приложение сломается при любом исключении. Поскольку Response.Redirect обычно выдает исключение ThreadAbortException, это может быть простой способ обрыва. Затем выполните !printexception, чтобы получить трассировку стека. Вы также можете сделать ~*e!clrstack, если мой WinDBG foo не подводит меня к просмотру управляемого стека для всех выполняющихся в данный момент потоков.

Обратите внимание, что вы останавливаете процесс w3wp во время взлома, так что будьте быстры!

Надеюсь, вы можете использовать другой метод вместо этого, но если все остальное не поможет, это может помочь вам начать.

0 голосов
/ 18 ноября 2008

Когда выполняется запрос на страницу asp.net, требующую аутентификации, asp.net перенаправляет на указанную страницу входа с предоставлением аргумента строки запроса ReturnUrl, идентифицирующего исходную запрашиваемую страницу по умолчанию. Хотя этот ReturnUrl является настраиваемым, если вы не изменили конфигурацию, его наличие должно указывать на то, что аутентификация не удалась.

В этом случае вам следует сосредоточиться на устранении неполадок в настройках аутентификации для страницы. Ответ Гордона Белла выглядит хорошо для этого.

<system.web>
...
</system.web>

<location path="NoAuthNeeded.aspx">
    <system.web>
        <authorization>
        <allow roles="*" />
        <allow roles="?" />
        </authorization>
    </system.web>
</location>
0 голосов
/ 18 ноября 2008

Поместите точку останова в начале каждого обработчика HTTP и обратите внимание, какой из них является последним вызванным обработчиком, прежде чем произойдет перенаправление. Вероятно, вы найдете причину проблемы в этом.

0 голосов
/ 18 ноября 2008

Вы пытались включить трассировку? Это может помочь.

Как вы указываете, страница не требует аутентификации, как:

<system.web>
...
</system.web>

<location path="NoAuthNeeded.aspx">
    <system.web>
        <authorization>
        <allow roles="*" />
        <allow roles="?" />
        </authorization>
    </system.web>
</location>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...