Angular 4 Odata (ASP.net) Проверка подлинности Windows в Chrome

У меня есть служба Angular 4, которая вызывает OData API. У меня есть настройки API для работы с аутентификацией Windows, это работает через IE (версия 11), но не с Chrome, где он выдает:

Не удалось загрузить ресурс: сервер ответил со статусом 401 (не авторизован)

Затем следует:

XMLHttpRequest не может загрузить http://gbldnrgaptest1:53219/User. Ответ на запрос предварительной проверки не проходит проверку контроля доступа: в запрошенном ресурсе отсутствует заголовок "Access-Control-Allow-Origin". Поэтому происхождение ' http://gap/' не разрешено. Ответ имел HTTP-код состояния 401.

Я использую следующие методы для создания своих опций для каждого отправленного запроса:

private GetOptions(): RequestOptionsArgs{
    let options : RequestOptionsArgs;
    options = {
        headers : this.GetHeaders(),
        withCredentials: true
    };

    return options;
}

private GetHeaders(): Headers {
    let headers = new Headers();
    headers.append("OData-Version","4.0");
    headers.append("Content-Type","application/json;odata.metadata=minimal");
    headers.append("Accept","application/json");
    return headers;
}

На моем API я включил CORS:

var cors = new EnableCorsAttribute(origins: "*", headers: "*", methods: "*", exposedHeaders: "*")
    {
        SupportsCredentials = true
    };
    config.EnableCors(cors);       

Я также включил проверку подлинности Windows в web.config:

<system.web>
  <compilation debug="true" targetFramework="4.5" />
  <httpRuntime targetFramework="4.5" />
  <authentication mode="Windows"></authentication>
</system.web>

Мой IIS также разрешен только для проверки подлинности Windows:

Кто-нибудь знает, что я могу пропустить?

Я чувствую, что это проблема заголовка; например, когда я просто запускаю запрос get в Chrome, например, перейдя к http://gbldnrgaptest1:53219/User он возвращается просто отлично, SOAP UI работает, как только я добавляю в NTLM аутентификацию.

1 ответ

Чтобы все заработало, пришлось сделать следующее:

Добавьте следующее в Web.Config:

<authorization>
  <allow verbs="OPTIONS" users="*"/>
  <deny users="?" />
</authorization>

Это произошло потому, что отправляемый предполетный запрос, по-видимому, не отправляет учетные данные, и это привело к возникновению ошибки. Теперь, когда вышеприведенные правила установлены, необходимо снова включить анонимную аутентификацию; затем набор правил в Web.Config отфильтрует то, что проходит, позволяя анонимно выполнять только запрос OPTIONS.

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