2015-10-18 4 views
6

У меня есть проект веб-API ASP.NET 5 MVC 6. Большинство конечных точек API имеют атрибут [Авторизовать], а проверка подлинности Windows включена как в IIS, так и в свойствах проекта в Visual Studio. Все это отлично работает в бета-версии 7.Поддержка аутентификации Windows в ASP.NET 5 beta 8

В бета-версии 8 это не работает. Легко воспроизвести это с полностью чистым проектом:

  1. Создайте новый проект, используя шаблон веб-API ASP.NET 5.
  2. Получите свойства проекта (не решение), перейдите на вкладку «Отладка», включите проверку подлинности Windows и отключите «Аноним». Сохраните изменения.
  3. Нажмите F5 и попробуйте запустить проект.

Результат:

Произошла ошибка при попытке определить идентификатор процесса процесса DNX хостинга приложения.

  1. Теперь вернитесь к свойствам проекта и включите Аноним. Оставьте Windows включенным. Сохраните изменения.
  2. Перейдите к контроллеру и добавьте атрибут [Авторизовать].
  3. F5 еще раз.

Результат:

Проект запускает на этот раз, но веб-API возвращает 500. Обратите внимание, в окне Output:

Microsoft.AspNet.Mvc.Controllers.ControllerActionInvoker: Предупреждение: Ошибка авторизации для запроса в фильтре «Microsoft.AspNet.Mvc.Filters.AuthorizeFilter».

Проект также не работает при публикации в IIS.

Как указано в бета-версии 8 announcement, модель хостинга изменилась, так что IIS теперь передает запрос через Kestrel. Servers page не дает никаких указаний на то, что Kestrel поддерживает проверку подлинности Windows. Есть ли какой-то трюк для получения Windows Authentication, работающего в бета-версии 8?

ответ

3

Это, кажется, known bug in the Visual Studio debugging tooling when using IIS Express. Пока это не исправлено, единственным обходным решением, которое я нашел, является отладка, работая через WebListener вместо IIS Express. Чтобы настроить это, в вашем методе Configure в Startup.cs add:

// If we're self-hosting, enable integrated authentication (if we're using 
// IIS, this will be done at the IIS configuration level). 
var listener = app.ServerFeatures.Get<WebListener>(); 
if (listener != null) 
{ 
    listener.AuthenticationManager.AuthenticationSchemes = 
     AuthenticationSchemes.NTLM; 
} 

Затем в проекте.json добавить weblistener cmd следующим образом:

"commands": { 
    "weblistener": "Microsoft.AspNet.Server.WebListener --config hosting.ini", 
    "web": "Microsoft.AspNet.Server.Kestrel" 
}, 

... или аналогичный. Затем, если вы отлаживаете использование профиля weblistener вместо IIS Express (или Интернета, который под Kestrel не поддерживает NTLM), вы должны иметь возможность продолжить работу, пока ошибка инструментария IIS Express будет устранена. Я полагаю, вам нужно добавить Microsoft.AspNet.Server.WebListener в ваши зависимости project.json, чтобы включить WebListener.

Я обнаружил, что если бы я изменил команду «web» непосредственно в project.json, Visual Studio поможет ее изменить довольно агрессивно, поэтому добавление отдельной команды as recommended by the Microsoft team, похоже, все в порядке.

+0

На данный момент это лучший ответ, поскольку он позволяет фактически выполнять проверку подлинности Windows. Благодаря! – Bill

+0

Нет проблем @Bill - Мне нужно было, чтобы он мог продолжать работать, пока они исправляют ошибку инструмента, не хотел, чтобы этот код возвращался обратно в бета-версию 7 именно из-за этого! –

+0

@Bill Я немного недавно обновил ответ, чтобы использовать отдельную команду, так как сегодня утром я вижу, что Visual Studio снова зашла и изменила мою «веб-команду» обратно на Kestrel ... Она немного хочет установить, что обратно! –

1

Существует известная ошибка инструментария, которая предотвращает отключение «анонимной аутентификации»: https://github.com/aspnet/Hosting/issues/419.

Повторно включите его, и проблема, которую вы видите, должна исчезнуть.

Удостоверьтесь, что вы также добавили app.UseIISPlatformHandler(); в свой метод Configure: он необходим для разрешения идентичности Windows, соответствующей токену, передаваемому IIS.

+0

Как я уже отмечал в моем вопросе, после того, как вы включите Anonymous (и оставить включен Windows), разрешение на веб-API еще выходит из строя. Это позволяет F5 запускать проект, но ничто не может аутентифицироваться в веб-API. Но да, мы обсуждаем это по этому вопросу. :) – Bill

0

Также в web.config следует установить forwardWindowsAuthToken = «истинный» например:

<httpPlatform processPath="%DNX_PATH%" arguments="%DNX_ARGS%" forwardWindowsAuthToken="true" startupTimeLimit="3600" />