#asp.net #authentication #iis
#asp.net #проверка подлинности #iis
Вопрос:
У меня есть приложение .NET WebAPI, работающее локально на IIS моего компьютера для разработчиков, но если я разверну его на сервере, я получу сообщение об ошибке
Ошибка HTTP 503. Служба недоступна.
всякий раз, когда я пытаюсь получить доступ к API. В тот же момент AppPool останавливается (да, он запущен правильно и работает правильно, пока я не выполню вызов API), и я получаю сообщение об ошибке в программе просмотра событий:
Процесс, обслуживающий пул приложений ‘MyNewTestAppPool’, получил фатальную ошибку связи со службой активации процессов Windows.
Контроллер, который я вызываю, действительно сложный:
public class ExampleController : ApiController
{
[HttpGet]
public bool GetTrue()
{
return true;
}
}
таким образом, это не может быть проблемой с переполнением стека, вызванным бесконечным циклом внутри моего кода. Я боюсь, что это бесконечный цикл внутри цепочки аутентификации и авторизации.
Основное изменение в другом приложении, которое правильно развернуто на том же сервере, заключается в том, что это приложение должно иметь большинство контроллеров, требующих аутентификации по локальной AD, с единственным контроллером, который этого не делает, в то время как другие приложения либо всегда требуют аутентификации, либо никогда.
Для достижения этого гибридного режима я сделал следующее:
- в Web.config я добавил
<authentication mode="Windows" />
- в IIS я включил как анонимную проверку подлинности, так и проверку подлинности Windows
- в
Global.asax.cs
я добавил атрибут AuthorizeAttribute для всех контроллеров:GlobalConfiguration.Configuration.Filters.Add(new System.Web.Http.AuthorizeAttribute());
- единственная функция, которая должна быть доступна без проверки подлинности, получила
[AllowAnonymous]
набор атрибутов.
Не уверен, что там происходит, кто-нибудь знает, что происходит или как это отладить?
Комментарии:
1. Значит, этот API работает в IIS правильно, если вы удалите аутентификацию и разрешите только анонимный доступ?
2. Нет, API корректно работает в IIS на моем компьютере разработчика, при этом приложение настроено так же, как и на сервере. Если я удалю проверку подлинности Windows из настроек IIS, ничего не изменится. Если я удалю атрибут авторизации из своего кода, ничего не изменится. Если я удалю оба, я смогу получить доступ ко всему как анонимный пользователь.
3. Действительно странно, что пул приложений отключается. Вы пробовали использовать другой пул приложений или что-то в этом роде? Также вы говорите, что на том же сервере есть другие приложения, на которых включена аутентификация Windows, и они не приводят к сбою процесса?
4. Да, это то, что я говорил. Поскольку это старое приложение находится «в производстве», я переместил новое приложение в другой (новый) пул приложений после первого сбоя, чтобы не допустить повторного сбоя производственного пула приложений. Это не исправило проблему. Я видел, что проблема исчезла час назад (не уверен, следует ли мне называть это «исправленным») после перезагрузки моего компьютера (он хотел установить Центр обновления Windows), затем очистить и перестроить в Visual Studio, а затем снова развернуть приложение… WTF !?
Ответ №1:
Убедитесь, что IIS_IUSRS (IIS 7.x) имеет доступ на чтение к папке приложения. Убедитесь, что идентификатор пула приложений, который вы используете, находится в группе IIS_IUSRS (например. IIS APPPOOL DefaultAppPool)