Asp.net core web api с использованием проверки подлинности Windows - запрос Cors неавторизован

В моем основном веб-API asp.net я настроил Cors в соответствии со статьей из Документация MS. Приложение веб-API использует проверку подлинности Windows (анонимная проверка подлинности отключена). Создана политика Cor и добавлено промежуточное ПО, как показано ниже, в startup.cs.

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy("CorsPolicy",
            builder => builder.WithOrigins("http://localhost:4200")
                .AllowAnyMethod()
                .AllowAnyHeader()
                .AllowCredentials()
            );
    });

    services.AddMvc().AddJsonOptions(options => {
        options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
    });
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{         
    //Enable CORS policy 
    app.UseCors("CorsPolicy");
    app.UseMvc();
}

Также применяется политика на уровне контроллера

[EnableCors("CorsPolicy"), Route("api/[controller]")]
public class LocationController : BaseController<Location>
{
  //code
}

Запрос опций становится неавторизованным. Запрос и ответ выглядят так

Asp.net core web api с использованием проверки подлинности Windows - запрос Cors неавторизован

Я видел похожие вопросы и пробовал почти все решения, но запрос параметров все еще не выполняется.

Не уверен, что это поможет, но я столкнулся с проблемой, позволяющей доступ к запросам CORS и API, который я создал. Я пробовал все под солнцем, но оказалось, что запросы OPTIONS отклоняются IIS.

phishfordead 03.05.2018 17:11

Вы отключили анонимную аутентификацию в IIS или iisSettings?

Kyle B 04.05.2018 15:10

Как вы настраиваете аутентификацию?

Rob 11.05.2018 08:30

Я настраиваю через настройки свойств веб-проекта в Visual Studio

rumi 11.05.2018 10:44

@KyleB Я отключил анонимную аутентификацию в настройках веб-проекта через Visual Studio

rumi 11.05.2018 10:46
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
14
5
8 949
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

Вы можете прочитать эту ветку: https://github.com/aspnet/CORS/issues/60. Вы можете смешивать анонимный и NTLM, чтобы ваши предварительные рейсы CORS не были отклонены (поскольку они не включают учетные данные Windows). IIS обрабатывает аутентификацию NTLM еще до того, как попадет в промежуточное программное обеспечение, так что это, вероятно, вещь IIS. Возможно, вам потребуется разрешить анонимные предполетные проверки COR.

Установка как windowsAuthentication:true, так и anonymousauthentican:true работала.

Sam 22.05.2021 04:07

Это очень похоже на CORS включен, но ответ для предварительной проверки имеет недопустимый код состояния HTTP 404 при POSTing JSON и предоставило решение, работающее для меня (у меня была ошибка 401 при запросах POST). Также не следует настраивать NTLM и Negotiate одновременно (Согласовать V / s NTLM).

Похоже, вы хотите передать учетные данные или вместе с запросом.

Пожалуйста, проверьте эта ссылка, чтобы добавить учетные данные / разрешить учетные данные пользователя.

Будьте осторожны при разрешении учетных данных из разных источников. Веб-сайт в другом домене может отправлять учетные данные вошедшего в систему пользователя в приложение от имени пользователя без ведома пользователя. Спецификация CORS также заявляет, что установка источника на «*» (все источники) недопустима, если присутствует заголовок Access-Control-Allow-Credentials.

Использование модуля IIS CORS великолепно решило проблему. Ниже URL-адрес для справки.

Работа с проверкой подлинности Windows Хотя это ни в коем случае не единственный сценарий, решенный модулем CORS, он был достаточно важным, чтобы вызвать вызов. Раньше, если вы пытались сделать междоменный запрос к приложению, которое использовало проверку подлинности Windows, ваш предварительный запрос завершался ошибкой, поскольку браузер не отправлял учетные данные с предварительным запросом. Невозможно было обойти это без включения анонимной аутентификации в вашем приложении. Поскольку модуль CORS запускается перед аутентификацией, он позволяет обрабатывать предполетный запрос без ущерба для модели безопасности вашего приложения. Вот пример того, как может выглядеть ваш файл web.config.

https://blogs.iis.net/iisteam/getting-started-with-the-iis-cors-module

Образец кода:

<?xml version = "1.0" encoding = "utf-8"?>
<configuration>
  <!-- To customize the asp.net core module uncomment and edit the following section. 
         For more info see https://go.microsoft.com/fwlink/?linkid=838655 -->
         <system.web>
        <authentication mode = "Windows"/>
    </system.web>
  <system.webServer>
  <cors enabled = "true" failUnlistedOrigins = "true">
            <add origin = "http://localhost:60096" allowCredentials = "true" >
            <allowHeaders allowAllRequestedHeaders = "true">
                    <add header = "Header1" />
                </allowHeaders>
            </add>
        </cors>
    <handlers>
      <add name = "aspNetCore" path = "*" verb = "*" modules = "AspNetCoreModule" resourceType = "Unspecified" />
    </handlers>
    <aspNetCore processPath = "dotnet" arguments = ".\Project.Api.dll" stdoutLogEnabled = "false" stdoutLogFile = ".\logs\stdout" />
  </system.webServer>
</configuration>

После пары часов выяснения, вот ПОЛНОЕ решение (от внешнего интерфейса до внутреннего):

Моя проблема: когда я включил аутентификацию Windows в своем веб-API, я не мог выполнять вызовы извлечения из моего приложения для реагирования на мой веб-API .NET Core 3.1, CORS волновался. При анонимной проверке подлинности это работало, но не при включенной проверке подлинности Windows.

1.launchSettings.json

это будет использоваться только для вашей среды разработки, убедитесь, что проверка подлинности Windows также включена в IIS на вашем prod-сервере.

{
  "iisSettings": {
    "windowsAuthentication": true,
    "anonymousAuthentication": false,
    "iisExpress": {
      "applicationUrl": "http://localhost:58747",
      "sslPort": 0
    }
  },
 {... more settings if any}
}

2.Startup.cs:

Здесь включена политика CORS. Здесь важен порядок методов. Кроме того, вам не нужно устанавливать их в web.config

public void ConfigureServices(IServiceCollection services)
    {
        services.AddCors(options =>
        {
            options.AddPolicy("CorsPolicy", //give it the name you want
                           builder =>
                           {
                               builder.WithOrigins( "http://localhost:3000", //dev site
                                                    "production web site"
                                                   .AllowAnyHeader()
                                                   .AllowAnyMethod()
                                                   .AllowCredentials();
                           });
        });

        //database services here

        services.AddControllers();
    }

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseRouting();

        // global policy same name as in the ConfigureServices()
        app.UseCors("CorsPolicy");

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }

3. Контроллер (ы):

using Microsoft.AspNetCore.Cors;
... your other usings

namespace ProjectTest.Controllers
{
    [ApiController]
    [EnableCors("CorsPolicy")] //THIS HERE needs to be the same name as set in your startup.cs
    [Route("[controller]")]
    public class FooController:Controller
    {
        [HttpGet("getTest")]
        public JsonResult GetTest()
        {
            return Json("bar");
        }
    }
}

4.Пример вызова выборки компонентов React:

"Credential: 'include" - это секрет

    await fetch('http://localhost:3000/Foo/getTest', {
        method: 'GET',
        credentials: 'include'
    }).then(resp => resp.json());

1) Установите для флага Разрешить Windows и анонимную аутентификацию значение true в файле launchSettings.json (файл настроек разработки).

Анонимная аутентификация: необходима для разрешения запроса на предполетную опцию.

{
  "iisSettings": {
    "windowsAuthentication": true,
    "anonymousAuthentication": true,
    "iis": 
      ...
}

2) Добавьте политику Cors в метод настройки сервиса.

public void ConfigureServices(IServiceCollection services)
{
         
        ...
          services.AddCors(options =>
              {
                  options.AddPolicy("MyCustomCorsPolicyName",
                              builder => builder.WithOrigins("http://YourDomainName/")
                                      .AllowAnyMethod()
                                      .AllowAnyHeader()
                                      .AllowCredentials()
                              );
              });
          services.AddAuthentication(IISDefaults.AuthenticationScheme);
          services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);      
}
   

3. Добавляет промежуточное ПО CORS в конвейер веб-приложений, чтобы разрешить междоменные запросы.

public void Configure(IApplicationBuilder app)
{
   ....
   app.UseCors("MyCustomCorsPolicyName");
   app.UseMvc();
}

4) Добавьте атрибут авторизации поверх вашего контроллера в Force, клиент для отправки учетных данных

[Authorize]
public class MyAPIController : ControllerBase
{
...
}

5) В JQuery или любом другом клиенте, который вы используете, установите для флага свойства withCredentials значение true.

$.ajax({
                type: "POST",
                datatype: "json",  
                url: "YourApiUrl",              
                xhrFields: {
                    withCredentials: true
                }

Это сработало для меня в моей среде разработки с использованием .net core 2.2, IIS Express с проверкой подлинности Windows.

Просто обратите внимание, что промежуточное ПО CORS не работает в IIS, см. Этот поток здесь

  1. Установить Модуль CORS в IIS
  2. Преобразуйте свой web.config (кстати, я использую .net core 3.1)
  3. Добавьте web.release.config в корень вашего приложения
  4. Следуйте этому XML-коду
<?xml version = "1.0" encoding = "utf-8"?>
<configuration xmlns:xdt = "http://schemas.microsoft.com/XML-Document-Transform">

  <system.web xdt:Transform = "Insert">
    <authentication mode = "Windows"/>
  </system.web>

  <system.webServer xdt:Transform = "Insert">
    <cors enabled = "true" failUnlistedOrigins = "true" >
      <add origin = "your origin" allowCredentials = "true" >
        <allowHeaders allowAllRequestedHeaders = "true">
          <add header = "your header" />
        </allowHeaders>
      </add>
    </cors>
  </system.webServer>

</configuration>
  1. Разверните свое приложение в IIS

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