Asp.net случайно перестает подчиняться бланкам аутентификации форм
Проблема
В прошлом месяце мы переместили нашу ферму веб-сайта asp.net с сервера 2008 R2 на сервер 2012 R2 и обновили до asp.net 4.5. Мы используем аутентификацию с использованием файлов cookie для предотвращения несанкционированного доступа к веб-сайту.
<authorization>
<deny users="?" />
<allow users="*" />
</authorization>
У нас есть определенные ресурсы и страницы (например: страница входа), которые отмечены белым цветом в файле web.config:
<location path="signin">
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
В течение последних нескольких месяцев мы замечаем, что IIS/Asp.net случайно перестает подчиняться "белым" и предполагает, что все должно быть аутентифицировано. Все запросы на сайт на этом сервере будут перенаправлены на страницу с подписью, которая затем выдает ошибку 500. Белые активы не могут быть восстановлены.
Есть 2 ошибки в средстве просмотра событий, которые мы видим, когда IIS запутался. Первое:
Exception type: NullReferenceException
Exception message: Object reference not set to an instance of an object.
at System.Web.PipelineModuleStepContainer.GetNextEvent(RequestNotification notification, Boolean isPostEvent, Int32 eventIndex)
at System.Web.HttpApplication.PipelineStepManager.ResumeSteps(Exception error)
at System.Web.HttpApplication.BeginProcessRequestNotification(HttpContext context, AsyncCallback cb)
at System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context)
Этот второй не отображается все время:
Event code: 4005
Event message: Forms authentication failed for the request. Reason: The ticket supplied has expired.
Процесс iis будет работать находкой в течение нескольких часов, а затем внезапно начнет делать эту странность. Как только мы переработаем пул приложений или даже изменим web.config, сайт снова начнет работать.
Что мы пробовали
Честно говоря, мы совершенно тупики. Это не происходило на наших старых серверах, но с тех пор мы сделали немало изменений на нашем сайте, но ничего не связано с аутентификацией.
-
Мы находимся в webfarm и определяем наш машинный ключ внутри нашего web.config.
<machineKey validationKey="XXX" decryptionKey="XXX" validation="SHA1" decryption="AES" />
-
Мы нацеливаем asp.net 4.5
<httpRuntime targetFramework="4.5" executionTimeout="120" maxQueryStringLength="4096" minFreeThreads="72" minLocalRequestFreeThreads="88" maxRequestLength="32768" />
-
Мы воссоздали пул приложений в IIS.
- Не уверен, что это важно, но мы используем общую конфигурацию IIS и общие сертификаты.
- Проблема происходит на всех веб-серверах в ферме, а не только на одном.
- Мы переустановили ОС на одном из серверов вчера... поэтому мы увидим, что это что-то исправить.
- Это не похоже на использование памяти. Иногда iis использует только 4gb, иногда 6gb.
- Он, похоже, не привязан к определенному исполнению страницы, которое мы можем сказать.
- Я запустил debug diag против дампа памяти, и нет ни одного потока, который работает долго и не использует сумасшедшую память.
Да, мы в тупике. Любая помощь приветствуется.
Ответы
Ответ 1
Я отвечу на свой вопрос тем, что мы сделали, чтобы решить проблему, хотя мы и не нашли причину. Мы заметили, что сервер начнет игнорировать правила "белого списка", когда он становится слишком тяжелым при загрузке. Не так много нагрузки, возможно, 40% использования в течение 5 минут. После этого он начнет игнорировать вещи.
Простым решением для нас было бросить больше аппаратного обеспечения. Мы работаем с 6 веб-серверами вместо 3. С тех пор мы не видели проблему с белыми списками. Так что честно... мы понятия не имеем, что случилось.
Ответ 2
У меня был аналогичный опыт, меняя IIS, чтобы анонимная аутентификация разрешила его для меня. В вашем случае я бы порекомендовал 2 вещи:
<location path="signin">
<system.web>
<authorization>
<allow users="?" />
<allow users="*" />
</authorization>
</system.web>
</location>
Я надеюсь, что это поможет
Ответ 3
Пока я не могу точно сказать, в чем проблема, я могу поделиться подобным опытом.
У нас был сайт, который использовал проверку подлинности форм, а также предполагал, что он терпит неудачу и принуждает всех к аутентификации. Мы обнаружили, что веб-сайт терпит крах, и IIS вместо этого возвращает веб-сайт по умолчанию. Нам потребовалось некоторое время, чтобы разобраться. Вы можете проверить, чтобы убедиться, что вы не смотрите на аналогичную ситуацию.
Ответ 4
Можете ли вы показать свою аутентификацию node с вашего веб-сайта?
Это должно быть примерно так:
<authentication mode="Forms">
<forms name="Logon" loginUrl="~/Logon.aspx" protection="All" timeout="60" defaultUrl="~/Default.aspx" />
</authentication>
Используете ли вы сервер состояния сеанса asp.net? Если вы проверяете, запущен ли сервер состояния asp.net службы.