it-swarm.com.ru

Основной веб-API Asp.net с использованием Windows-аутентификации - Cors-запрос не авторизован

В моем основном веб-интерфейсе 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
}

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

 enter image description here

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

9
rumi

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

3
Kyle B

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

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

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

0
Asav Vora

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

0
Павел Марченко

Использование 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>
0
AJP