У меня есть служба RAP WebAPI 2, работающая под управлением Windows Authentication. Он размещается отдельно от веб-сайта, поэтому я включил CORS с использованием пакета ASP.NET CORS NuGet. Мой клиентский сайт использует AngularJS.
До сих пор, вот что я пережил:
- У меня не было установлен набор Credentials, поэтому запросы CORS возвращали 401. Решено путем добавления withCredentials в мою конфигурацию $httpProvider.
- Затем я установил свой EnableCorsAttribute с подстановочным знаком, который не разрешен при использовании учетных данных. Решено путем установки явного списка истоков.
- Это позволило моим запросам GET преуспеть, но мой POST выпустил предпродажный запрос, и я не создал никаких действий контроллера для поддержки глагола OPTIONS. Чтобы решить эту проблему, я применил MessageHandler как глобальный обработчик OPTIONS. Он просто возвращает 200 для любого запроса OPTIONS. Я знаю, что это не идеально, но работает пока, в Fiddler.
Где я застрял - мои предварительные вызовы Angular не включают учетные данные. Согласно этот ответ, это по дизайну, так как запросы OPTIONS предназначены для анонимности. Однако проверка подлинности Windows останавливает запрос с помощью 401.
Я попытался поместить атрибут [AllowAnonymous] в свой MessageHandler. На моем компьютере-разработчике он работает - глаголы OPTIONS не требуют аутентификации, но другие глаголы. Однако, когда я создаю и развертываю на тестовом сервере, я продолжаю получать 401 в моем запросе OPTIONS.
Можно ли применить [AllowAnonymous] к моему MessageHandler при использовании Windows Authentication? Если да, то какие-либо рекомендации о том, как это сделать? Или это неправильная дыра кролика, и я должен смотреть на другой подход?
UPDATE: Я смог заставить его работать, установив для проверки подлинности Windows и анонимной аутентификации на сайте в IIS. Это заставило всех разрешить анонимность, поэтому я добавил глобальный фильтр Authorize, сохраняя AllowAnonymous в своем MessageHandler.
Однако это похоже на взлом... Я всегда понимал, что нужно использовать только один метод аутентификации (не смешанный). Если у кого-то будет лучший подход, я буду благодарен за это.