Контроллер Web Api 2 ведет себя по-разному в Visual Studio 2012 и 2013, атрибут авторизации

точный, точный файл .sln, который содержит мой веб-проект MVC 5/Web Api 2, ведет себя одним образом, когда я запускаю его из установки Visual Studio 2012, и ведет себя совершенно по-другому, когда я запускаю его. из Visual Studio 2013.

В частности, у меня есть CustomerController, наследуемый от ApiController, который отвечает на запросы OData (нет, я не наследовал от OdataController). Все это отлично работает при запуске из Visual Studio 2012 (и при развертывании на моем тестовом веб-сервере 2008 R2). Когда я запускаю его из Visual Studio 2013, я получаю следующее тело ответа:

{"Message":"Authorization has been denied for this request."} 

Да, мой контроллер украшен атрибутом Authorize:

<Authorize(Roles:="MYCORP\my_activedirectory_group")>
Public Class CustomerController

Когда я удаляю этот атрибут, я могу запускать свой проект локально из Visual Studio 2013 (которая в настоящее время запускает мой проект в IIS Express, тогда как в VS 2012 он запускает его из ASP.NET Development). сервер)

В чем дело?




Ответы (1)


Хорошо, я понял это, подумав об этом.

По-видимому, IIS Express не был настроен для использования проверки подлинности Windows.

Я щелкнул правой кнопкой мыши значок IIS Express на панели задач и выбрал «Показать все приложения».

В появившемся диалоговом окне я выбрал одно из приложений, перечисленных в сетке (в списке только 1, так как у меня есть только 1, работающее в Visual Studio).

Как только элемент приложения выделен, вы можете увидеть гиперссылку/путь к файлу applicationhost.config.

В этом конфигурационном файле я отредактировал этот раздел, найдя около 1/3 пути вниз в элементе ‹security›:

<authentication>
    <anonymousAuthentication enabled="false" userName="" />
    <basicAuthentication enabled="false" />
    <clientCertificateMappingAuthentication enabled="false" />
    <digestAuthentication enabled="false" />

    <iisClientCertificateMappingAuthentication enabled="false"></iisClientCertificateMappingAuthentication>

    <windowsAuthentication enabled="true">
        <providers>
           <add value="NTLM" />
           <add value="Negotiate" />
        </providers>
    </windowsAuthentication>
</authentication>

Выше я установил для всех атрибутов «включено» значение «false», кроме последнего в элементе windowsAuthentication. В нашей среде я всегда перемещаю NTLM на первое место в списке поставщиков.

person bkwdesign    schedule 20.05.2015
comment
Так что это было не яблоки к яблокам в конце концов. - person Robert Harvey; 20.05.2015
comment
Ну, решение не изменилось, но среды Visual Studio, которые я сравнивал, использовали разные хост-среды, что застало меня врасплох. - person bkwdesign; 21.05.2015