Разрешить анонимность ASP.NET Web API-контроллеру, в то время как остальная часть приложения выполняется под проверкой подлинности Windows

У меня есть веб-приложение ASP.NET с включенной аутентификацией Windows. Мне нужно написать контроллер веб-API ASP.NET в этом приложении, которое использует некоторую логику доступа к данным приложения. Я не хочу создавать новый проект только для веб-API, поскольку мне нужно выставить только небольшую конечную точку, которая обрабатывает пару запросов.

Клиенты Web API будут использовать анонимную службу. Чтобы это разрешить, я попытался использовать фильтр действия AllowAnonymous на обоих контроллерах, а также действия. Но, когда я пытаюсь использовать API с помощью Fiddler, запрос терпит неудачу с состоянием 401, говоря "401 - Несанкционированное: доступ запрещен из-за недопустимых учетных данных".

Есть ли способ достичь этого?

Ответ 1

Я немного опаздываю на вечеринку, но убедитесь, что анонимная аутентификация включена. Затем добавьте:

<configuration>
  ...
  <location path="api/...">
    <system.web>
      <authorization>
        <allow users="?"/>
      </authorization>
    </system.web>
  </location>
</configuration>

В свой web.config.

Я предполагаю, что у вас есть:

<system.web>
  ...
  <authentication mode="Windows" />
  <authorization>
    <deny users="?" />
  </authorization>
</system.web>

Это сработало для меня.

Ответ 2

Ну, для всех контроллеров, которым требуется аутентификация, нужен атрибут Authorize (который может быть глобальным фильтром) - тогда используйте AllowAnonymous для тех, которые не нуждаются в authN.

Затем убедитесь, что в IIS для vdir включена анонимная аутентификация, а также убедитесь, что в web.config нет глобального элемента полномочий.

Ответ 3

Как я решил проблему, используя Visual Studio 2015 и .NET 4.5.2, было задание свойств проекта веб-API как Анонимная аутентификация и Аутентификация Windows set to Enabled (обратите внимание, что они также должны быть установлены в экземпляре IIS). Затем в моих контроллерах я украсил методы, требующие аутентификации с атрибутом [Authorize], а также имя моего настраиваемого атрибута проверки подлинности.

Это разрешило настройку по умолчанию для методов контроллера принимать анонимные вызовы, и только несколько специальных методов, требующих аутентификации, имели дополнительные декораторы. Мне не нужно было добавлять ничего в файлы web.config или WebApiConfig.cs. В Global.asax появился вызов моей настраиваемой статической функции проверки подлинности, которая устанавливает глобальные значения.