Я пытаюсь передать данные POST из моей службы Angular 2 в API ASP.NET 5, который использует проверку подлинности Windows и размещен в IIS. После некоторой модификации угловых запросы создаются:Способ запроса браузера OPTIONS и авторизация окон
var request = new XMLHttpRequest();
request.withCredentials = true;
Вот решить мою проблему с разрешающими запросами GET, теперь для запроса первого GET, сервер возвращает 401 ответа с заголовками:
WWW-Authenticate:Negotiate
WWW-Authenticate:NTLM
И после этого угловой клиент отправляет другой запрос, но на этот раз с заголовком авторизации, содержащим токен NTLM, и он работает.
Для запроса POST я добавил "Content-Type: применение/JSON" в заголовке запроса, так что браузер посылает первый запрос, как это:
OPTIONS /api/reservation/ HTTP/1.1
Host: localhost:82
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Access-Control-Request-Method: POST
Origin: http://localhost:81
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36
Access-Control-Request-Headers: content-type
Accept: */*
Referer: http://localhost:81/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: pl-PL,pl;q=0.8,en-US;q=0.6,en;q=0.4
И сервер отвечает:
HTTP/1.1 401 Unauthorized
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/8.5
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
X-Powered-By: ASP.NET
Date: Wed, 13 Jan 2016 11:54:56 GMT
Content-Length: 6394
Но на этот раз вместо другого запроса с авторизацией, как в запросе GET, произошла ошибка:
XMLHttpRequest cannot load http://localhost:82/api/reservation/. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:81' is therefore not allowed access. The response had HTTP status code 401.
Для CORS Я использую эту конфигурацию в ASP.NET 5:
services.AddCors(options => options.AddPolicy("AllowAll", p => p.AllowAnyOrigin().AllowAnyMethod().WithHeaders("accept", "authorization", "content-type", "origin", "x-custom-header").AllowCredentials()));
Могу ли я каким-то образом отключить проверку подлинности Windows для OPTIONS запросов в IIS? Или, может быть, есть способ заставить браузер отслеживать авторизацию?
Можете ли вы предоставить дополнительную информацию о том, как вы получили запрос GET? Я устанавливаю withCredentials = true, используя угловые заголовки http.get, но похоже, что заголовок/токен авторизации никогда не отправляется. – alrm3000
Это был довольно взлом, но я заменил реализацию [BrowserXhr] (https://github.com/angular/angular/blob/master/modules/%40angular/http/src/backends/browser_xhr.ts) и зарегистрировал его в Угловой DI. – Adiqq