Web API 2, CORS, NTLM & OWIN / Katana с Angular 2

Огромное количество проблем, заставляющих это работать.

Думаю, я бы поднял общие проблемы и решения, потратив на это целый день и ведя другими ложными путями.

Настроить:

  1. Сервер Web Api 2
  2. Сервер настроен для NTLM (согласование)
  3. Сайт Angular, размещенный на другой машине или в порту
  4. Веб-сайт подключается к API, чтобы делать, ну, вещи.

Вопросы:

  1. Базовая настройка и при первом запуске вы получаете no access-control-allow-origin header is present
  2. Установка Cors на сервере, и вы все еще получаете проблему
  3. В конце концов вы понимаете, что Angular не устанавливает WithCredentials на его звонки и исправьте это, сейчас GET работает но PUT, POST & DELETE потерпеть неудачу с чем-то о предварительных полетах.

1 ответ

Решение

И решения:

  1. Во-первых, ваш сервер должен быть включен для cors, и это должна быть первая строка в конфигурации вашего приложения:

    WebApp.Start(_configuration.Url, app => { app.UseCors(CorsOptions.AllowAll);

    1. Включить аутентификацию, НО не перед полетом OPTIONS звонки:

    var listener = (HttpListener)app.Properties["System.Net.HttpListener"]; listener.AuthenticationSchemeSelectorDelegate = request => request.HttpMethod == "OPTIONS" ? AuthenticationSchemes.Anonymous : AuthenticationSchemes.Negotiate;

    1. Установите свой угловой код для отправки звонков с WithCredentials, Есть много разных способов сделать это, но мы использовали перехватчик аутентификации:intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { const authReq = request.clone({ withCredentials: true }); return next.handle(authReq)

    2. Если вы хотите сделать что-то необычное для своего Auth, вы можете создать свое собственное промежуточное ПО, расширив OwinMiddleware и переопределяя Invoke метод. Это может быть затем зарегистрировано в конвейере с app.Use<MyMiddleware>(paramsToConstructor) в вашем override Метод, который вы можете получить доступ к личности пользователя с помощью:

    var identity = new ClaimsIdentity(context.Authentication.User.Identity.AuthenticationType);

Другие вопросы по тегам