2016-01-13 3 views
3

Я пытаюсь передать данные 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? Или, может быть, есть способ заставить браузер отслеживать авторизацию?

+0

Можете ли вы предоставить дополнительную информацию о том, как вы получили запрос GET? Я устанавливаю withCredentials = true, используя угловые заголовки http.get, но похоже, что заголовок/токен авторизации никогда не отправляется. – alrm3000

+0

Это был довольно взлом, но я заменил реализацию [BrowserXhr] (https://github.com/angular/angular/blob/master/modules/%40angular/http/src/backends/browser_xhr.ts) и зарегистрировал его в Угловой DI. – Adiqq

ответ

3

Хорошо, я нашел способ, чтобы заставить его работать на IIS Express или IIS 8.5, с помощью ASP.NET 5.

Нам нужно изменить Wwwroot/web.config как это:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.webServer> 
    <handlers> 
     <add name="httpPlatformHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified" /> 
    </handlers> 
    <httpPlatform processPath="%DNX_PATH%" arguments="%DNX_ARGS%" stdoutLogEnabled="false" startupTimeLimit="3600" forwardWindowsAuthToken="true"></httpPlatform> 
    <httpProtocol> 
     <customHeaders> 
     <add name="Access-Control-Request-Headers" value="Content-Type,Authorization" /> 
     <add name="Access-Control-Allow-Headers" value="Content-Type,Authorization" /> 
     <add name="Access-Control-Allow-Origin" value="http://localhost:5814" /> 
     <add name="Access-Control-Allow-Credentials" value="true" /> 
     </customHeaders> 
    </httpProtocol> 
    <security> 
     <authorization> 
     <!--<remove users="*" roles="" verbs="" /> Uncomment for IIS--> 
     <add accessType="Allow" users="*" verbs="GET,POST,PUT" /> 
     <add accessType="Allow" users="?" verbs="OPTIONS" /> 
     <add accessType="Deny" users="?" verbs="GET,POST,PUT" /> 
     </authorization> 
    </security> 
    </system.webServer> 
    <system.web> 
    <authorization> 
     <allow users="*" verbs="GET,POST,PUT" /> 
     <allow users="?" verbs="OPTIONS" /> 
    </authorization> 
    </system.web> 
</configuration> 

в launchSettings.json установлено:

"iisSettings": { 
"windowsAuthentication": true, 
"anonymousAuthentication": true, 
"iisExpress": { 
    "applicationUrl": "http://localhost:4402/", 
    "sslPort": 0 
} 

И в Startup.cs:

services.AddCors(options => options.AddPolicy("AllowAll", p => p.AllowAnyMethod().WithHeaders("accept", "authorization", "content-type", "origin", "x-custom-header").AllowCredentials())); 

Некоторые из этих настроек могут быть необязательными.

Для IIS нам необходимо установить аутентификацию Windows и авторизацию URL.

+2

Анонимная аутентификация должна быть разрешена с включенными cors (app.UseMvc() должен быть после app.UseCors(), конечно), поэтому он не пытается аутентифицировать проверку предполетного кода. Не требуется модификация web.config. – pajics

+0

Его правда! У меня была такая же проблема, и мой web.config не нужно было менять. Я просто активировал анонимную проверку подлинности и запросы POST. Благодаря! – David