Web API 2, CORS, NTLM & OWIN / Katana с Angular 2
Огромное количество проблем, заставляющих это работать.
Думаю, я бы поднял общие проблемы и решения, потратив на это целый день и ведя другими ложными путями.
Настроить:
- Сервер Web Api 2
- Сервер настроен для NTLM (согласование)
- Сайт Angular, размещенный на другой машине или в порту
- Веб-сайт подключается к API, чтобы делать, ну, вещи.
Вопросы:
- Базовая настройка и при первом запуске вы получаете
no access-control-allow-origin header is present
- Установка Cors на сервере, и вы все еще получаете проблему
- В конце концов вы понимаете, что Angular не устанавливает
WithCredentials
на его звонки и исправьте это, сейчасGET
работает ноPUT
,POST
&DELETE
потерпеть неудачу с чем-то о предварительных полетах.
1 ответ
И решения:
Во-первых, ваш сервер должен быть включен для cors, и это должна быть первая строка в конфигурации вашего приложения:
WebApp.Start(_configuration.Url, app => { app.UseCors(CorsOptions.AllowAll);
- Включить аутентификацию, НО не перед полетом
OPTIONS
звонки:
var listener = (HttpListener)app.Properties["System.Net.HttpListener"]; listener.AuthenticationSchemeSelectorDelegate = request => request.HttpMethod == "OPTIONS" ? AuthenticationSchemes.Anonymous : AuthenticationSchemes.Negotiate;
Установите свой угловой код для отправки звонков с
WithCredentials
, Есть много разных способов сделать это, но мы использовали перехватчик аутентификации:intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { const authReq = request.clone({ withCredentials: true }); return next.handle(authReq)
Если вы хотите сделать что-то необычное для своего Auth, вы можете создать свое собственное промежуточное ПО, расширив
OwinMiddleware
и переопределяяInvoke
метод. Это может быть затем зарегистрировано в конвейере сapp.Use<MyMiddleware>(paramsToConstructor)
в вашемoverride
Метод, который вы можете получить доступ к личности пользователя с помощью:
var identity = new ClaimsIdentity(context.Authentication.User.Identity.AuthenticationType);
- Включить аутентификацию, НО не перед полетом