У меня есть внутреннее веб-приложение, в котором у каждого есть имя пользователя и пароль Active Directory. Они входят в мое веб-приложение. Часть представления пользовательского интерфейса находится на одном сервере, а WebAPI - на другом сервере, поэтому мне пришлось реализовать CORS. Кроме того, одна функция в WebAPI записывает XML в файл на третьем сервере, поэтому я использую олицетворение именно для этой функции, где файл XML записывается с использованием учетных данных вошедшего в систему пользователя AD. Все авторизованные пользователи принадлежат к определенной c группе AD «EFI_Users» с разрешениями на запись на 3-й сервер.
У меня был один и тот же код на нашей паре серверов DEV и на нашей паре серверов TEST. CORS работал, но олицетворение не на DEV. Напротив, олицетворение работало, но CORS не на ТЕСТ. Я обнаружил, что серверы WebAPI имеют разные настройки IIS. Настройка анонимной аутентификации была разницей. На DEV анонимная аутентификация была включена, Windows аутентификация отключена. На TEST, наоборот: анонимный был отключен, Windows аутентификация была включена.
Установка анонимной аутентификации на ENABLE была секретом, чтобы CORS начал работать!
Но включение анонимной аутентификации сделало олицетворение перестал работать и дал мне эту ошибку:
«Анонимная личность не может выполнять олицетворение».
Я не знаю, что делать, чтобы CORS и олицетворение работали в одном приложении. Мне нужна помощь!
Вот что у меня есть. Я использую. NET 4.5.2, Visual Studio 2017 с C#, MVC, Javascript, Entity Framework и Breeze в шаблоне SPA.
В настройках UI и IAP WebAPI включена анонимная и Windows Аутентификация.
Мой пользовательский интерфейс web.config имеет следующий код:
<system.web>
<authentication mode="Windows" />
<authorization>
<allow roles="eFI_Users" />
<deny users="*" />
</authorization>
</system.web>
Моя сеть WebAPI. В config есть этот код (установка impersonate = «true» приводит к сбою CORS)
<system.web>
<identity impersonate="false" />
<authorization>
<allow roles="eFI_Users" />
<allow users="?" />
<!--<deny users="*" />-->
</authorization>
</system.web>
Я думаю, что мой код CORS и код олицетворения C# настроен правильно, потому что каждый работает, когда анонимная аутентификация включена или отключена, соответственно .
Я где-то читал, что когда приложение использует ANONYMOUS AUTHENTICATION и
-IMPERSONATION is disabled, the app pool identity is used to execute app code.
or
-IMPERSONATION is enabled, the NT Authority\IUSR account is used to execute app code.
Итак, у меня был отдельный пул приложений, настроенный с «LocalSystem» в качестве идентификатора пула приложений, затем попробовал оба impersonate = false в WebAPI web.config. Тот же конечный результат, что и при использовании AppPoolIdentity для идентификации:
«Анонимная идентификация не может выполнять олицетворение».
Одна вещь, которую я нахожу странной и не понимаю, я отображал оба User.Identity.Name и ((WindowsIdentity) User.Identity) .IsAnonymous в домашнем контроллере пользовательского интерфейса и в контроллере транзакций WebAPI до начала олицетворения. Получил эти результаты:
UI HomeController: Name=(my userid), IsAnonymous=false
WebAPI TransactionController: Name=null, IsAnonymouse=true
Не уверен, что я понимаю, что происходит с пользователем, когда он переходит в WebAPI. Начинается с аутентифицированного пользователя в пользовательском интерфейсе, но становится анонимным, когда он попадает в WebAPI. Мой web.config не так?
Мне нужен способ получить олицетворение для работы с включенным Anonymous. Или способ заставить CORS работать с отключенным Anonymous.