.NetCore 2.2 Web Api с аутентификацией Windows возвращает 401 из других доменов

Прежде чем написать это, я потратил много времени на поиск и пробу множества вещей, но ничего не помогло. Это .NetCore 2.2 Web Api, и я использую его из приложения Angular 8.

  1. Если я вызываю веб-api из того же домена, он работает нормально.

  2. Если я вызываю веб-api из другого домена (или локального хоста), он возвращает 401 (неавторизованный).

  3. Если я вызываю веб-API из другого домена (или локального хоста) с отключенной аутентификацией Windows, он работает нормально (поэтому CORS настроен правильно).

В моем launchSettings.json у меня есть:

  "iisSettings": {
    "windowsAuthentication": true,
    "anonymousAuthentication": false,

В моем web.config у меня есть:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <httpProtocol>
        <customHeaders>
          <add name="Access-Control-Allow-Origin" value="*" />
        </customHeaders>
      </httpProtocol>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" />
      </handlers>
      <aspNetCore processPath="%LAUNCHER_PATH%" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" hostingModel="InProcess" arguments="%LAUNCHER_ARGS%" />
      <security>
        <authentication>
           <anonymousAuthentication enabled="false" />
           <windowsAuthentication enabled="true" />
        </authentication>
      </security>
    </system.webServer>
  </location>
</configuration>

В IIS у меня включена проверка подлинности Windows и отключена анонимная проверка подлинности.

В моем Startup.cs у меня есть:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthentication(IISDefaults.AuthenticationScheme);
        services.AddCors(options =>
        {
            options.AddPolicy("CorsPolicy",
            builder =>
            {
               builder.AllowAnyOrigin()
               .AllowAnyMethod()
               .AllowAnyHeader()
               .AllowCredentials();
            });
        });

        services.AddMvc()
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
     }

а также

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseAuthentication();
        app.UseCors("CorsPolicy");
        app.UseMvc();
    }

Что мне не хватает? Есть идеи по этому поводу?


person José Matos    schedule 03.09.2019    source источник


Ответы (2)


Я предполагаю, что запрос к веб-API инициируется из браузера?

При использовании проверки подлинности Windows ожидается ответ 401. Затем ожидается, что клиент повторно отправит запрос с правильными учетными данными.

Браузеры можно настроить на автоматическую отправку учетных данных текущего пользователя, вошедшего в систему. IE и Chrome сделают это, если сайт находится в списке надежных сайтов в настройках обозревателя. В Firefox есть собственная network.negotiate-auth.delegation-uris настройка.

Так что либо:

  1. Браузер не доверяет сайту, поэтому он не отправляет учетные данные автоматически, или
  2. Домен вашего сервера не доверяет домену пользователя, поэтому даже если браузер отправит учетные данные текущего пользователя, они будут отклонены вторым ответом 401.
person Gabriel Luci    schedule 03.09.2019
comment
Веб-API вызывается из приложения angular. Оба находятся на надежных сайтах и ​​являются субдоменами одного домена. Он открывает диалоговое окно с запросом учетных данных. - person José Matos; 03.09.2019
comment
Вы видите отправленный заголовок авторизации? (обратите внимание, что инструменты разработчика Chrome не показывают этот заголовок, даже если он отправлен, но IE будет - или использовать Fiddler) - person Gabriel Luci; 03.09.2019
comment
Вы можете прочитать о потоке запросов для проверки подлинности Windows здесь. Это может помочь понять, что должно произойти. - person Gabriel Luci; 03.09.2019
comment
Спасибо за эту информацию, но это не решает проблему. Мой вопрос был и есть, как я могу заставить его работать? - person José Matos; 04.09.2019
comment
Я знаю :) Вот почему я спросил, видите ли вы, что отправляется заголовок авторизации. Если этого не произойдет, ничего не выйдет. - person Gabriel Luci; 04.09.2019

Изменение порядка промежуточного программного обеспечения может быть всем, что вам нужно для решения этой проблемы - см. Этот Источник Microsoft в Middleware Order, в котором указано, что UseCors() следует добавить перед UseAuthentication().

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseCors("CorsPolicy");
    app.UseAuthentication();
    app.UseMvc();
}

Этот ответ может быть слишком поздним, чтобы помочь OP, но, возможно, он поможет кому-то позже.

person egnomerator    schedule 20.02.2020