jQuery - невозможно выполнить запрос ajax с заголовком авторизации

У меня есть проект API ASP.NET Core, работающий на моем локальном IIS, и клиентский веб-сайт, работающий в среде разработки (http://localhost:53559). У API есть защищенный ресурс, который я хочу вызвать с заголовком авторизации.

В моем API ASP.NET я включил CORS, используя:

services.AddCors();
app.UseCors(builder => builder.AllowAnyOrigin());

Мой вызов ajax выглядит так:

$.ajax({
    type: "GET",
    url: "http://localhost/MyApi/api/values",
    async: true,
    success: function (data) {
        setJsonResult(data);
        showResultPane("API request result");
    },
    error: function (obj, textStatus, errorThrown) {
        setHtmlResult("Error returned by API: " + errorThrown);
        showResultPane("Unauthorized request result");
    },
    beforeSend: function (request) {
        if (currentToken) {
            request.withCredentials = true;
            request.setRequestHeader("Authorization", "Bearer " + currentToken);
        }
    }
});

Если я не включаю заголовок в запрос, я получаю ответ 401, как и ожидалось. И глядя на запрос с помощью Fiddler, я вижу в запросе следующее:

GET http://localhost/MyApi/api/values HTTP/1.1
Host: localhost
Connection: keep-alive
Accept: */*
Origin: http://localhost:53559
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36     (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Referer: http://localhost:53559/
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: en-US,en;q=0.8,he;q=0.6

Но когда я добавляю свой заголовок авторизации, я получаю ответ 204, и это то, что у меня есть на запрос (который, вне всякого сомнения, не работает и совсем не похож на запрос, который я ожидаю получить - не GET вызов, без заголовка авторизации ....):

OPTIONS http://localhost/MyApi/api/values HTTP/1.1
Host: localhost
Connection: keep-alive
Access-Control-Request-Method: GET
Origin: http://localhost:53559
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36     (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Access-Control-Request-Headers: authorization
Accept: */*
Referer: http://localhost:53559/
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: en-US,en;q=0.8,he;q=0.6

Я использую IdentityServer для аутентификации.

Что мне здесь не хватает? почему я не могу отправить заголовки с запросом?


person developer82    schedule 08.06.2017    source источник
comment
Возможный дубликат AJAX в Chrome, отправляющий ОПЦИИ вместо GET / POST / PUT / DELETE?   -  person moritzg    schedule 08.06.2017


Ответы (1)


Я добавил в свой web.config следующее, и это сработало:

<add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, Authorization" />
person developer82    schedule 08.06.2017