Ошибка CORS SEC7120 на Edge только при вызове API того же источника с перенаправлением на провайдера аутентификации - PullRequest
0 голосов
/ 30 апреля 2019

Я разрабатываю новую функцию для существующего приложения ASP.NET MVC (не Core).Эта функция состоит из нескольких новых видов, каждый из которых имеет одну или несколько диаграмм.Данные для этих диаграмм загружаются в отдельные запросы GET с использованием AJAX.

У меня все отлично работает в Google Chrome, Firefox и Opera, но с MS Edge я сталкиваюсь с ошибкой, которую я не совсем уверен, какиметь дело с - другие упоминания об этой ошибке, кажется, всегда приходят в других сценариях, чем у меня ...

Ошибка, которая возникает при запросе загрузки данных диаграммы из моего собственного API того же происхождения, которыйвыполняется после того, как представление было успешно возвращено:

SEC7120: [CORS] Источник "https://skillmanagementdev.azurewebsites.net" не найден" https://skillmanagementdev.azurewebsites.net" в Access-Control-Allow-Заголовок ответа источника для ресурса перекрестного происхождения в "https://login.microsoftonline.com/ed48a[...]965fab/oauth2/authorize?client_id=2ccb[...]e236&response_mode=form_post&response_type=code+id_token&scope=openid+profile&state=OpenIdConnect.AuthenticationProperties%3dG-EwoO[...]ZDJj&x-client-SKU=ID_NET&x-client-ver=1.0.40306.1554".

  • Это происходит только в Microsoft Edge, а не в Chrome, Firefox или Opera.
  • Это происходит, когдаотладка с помощью localhost, а также с Dev-Environment (с URL-адресом, указанным выше), который представляет собой веб-приложение Azure, точно так же, как и производительная среда.
  • API и веб-сайт MVCсервер имеет одинаковое происхождение / соотв.API не отделен от остальной части веб-приложения.
  • Каждый запрос (как для получения представления, так и для вызова API) должен быть авторизован.В обоих типах запросов используется один и тот же рабочий процесс проверки подлинности (проверка подлинности с использованием cookie-файлов с использованием Azure AD в качестве поставщика проверки подлинности)
  • Используется среда ASP.NET MVC;Я не использую конкретную структуру API, API - это просто «обычный» контроллер, возвращающий ContentResult вместо ActionResult

. Меня особенно смущают две вещи:

  1. Почемупроблема возникает только с MS Edge?
  2. Почему проблема не возникает в запросе на просмотр (который успешно загружен), который также должен сделать обход провайдеру аутентификации.

Как и предлагалось другими решениями (как при включении, так и при отключении стека), я попытался установить "app.UseCors" в Startup.Auth.cs, но без каких-либо заметных изменений.

@ LinuxDisciple заметил, что вЗапросы API, показанные ниже, Chrome отправляет cookie (уже аутентифицирован), а Edge - нет.Такое поведение Edge является неожиданным, поскольку аутентификация должна быть успешной по запросу для представления, которое происходит непосредственно перед запросом к API, поэтому ожидается, что клиент всегда уже имеет действительный сеанс после вызова API.Таким образом, это может привести к тому, что запрос API-интерфейса Edge не отправляет cookie-файл ... При попытке прямого доступа к URL-адресу API-интерфейса форма входа отображается правильно, и все работает, как и ожидалось, но в сочетании с предварительным вызовом View.Я получаю сообщение об ошибке, показанное здесь.

Дополнительная информация Диаграмма последовательности операций для потока запросов (к этой проблеме относится только нижняя половина) Sequence diagram

Снимок экрана с запросом API в Microsoft Edge, который останавливается при перенаправлении к поставщику аутентификации:

Request to API in Microsoft Edge

Для сравнения снимок экрана точно такого же запроса вGoogle Chrome: enter image description here

Код API-контроллера

[AuthorizeAAD(Roles = "SkillManagement_AlleMA, SkillManagement_Sekretariat, SkillManagement_Sales, SkillManagement_KPZ_Leiter")]
public class AnalyticsApiController : Controller
{
    private readonly IAnalyticsDataService _analyticsDataService;
    private readonly IAnalyticsDataRepository _analyticsDataRepository;

    public AnalyticsApiController(
        IAnalyticsDataService analyticsDataService,
        IAnalyticsDataRepository analyticsDataRepository)
    {
        _analyticsDataService = analyticsDataService;
        _analyticsDataRepository = analyticsDataRepository;
    }

    [Route("analytics/api/knowledgesSkillCounts")]
    [HttpGet]
    public ContentResult GetKnowledgesSkillCounts()
    {
        var existingData = _analyticsDataRepository.Get()
            .SingleOrDefault(d => d.TypeKey == AnalyticsDataType.SkillCounts)?
            .Data;

        var data = existingData ?? Newtonsoft.Json.JsonConvert.SerializeObject(_analyticsDataService.GetAllKnowledgesSkillCounts());

        return Content(data, "application/json");
    }
}

ConfigureAuth-Method в Startup.Auth:

private void ConfigureAuth(IAppBuilder app)
    {
        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
        //Tried to use app.UseCors(...) here
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = "Cookies",
            CookieManager = new SystemWebChunkingCookieManager()
        });

        var openIdConnectAuthenticationOptions = new OpenIdConnectAuthenticationOptions
        {
            ClientId = _clientId,
            Authority = _authority,
            Notifications = new OpenIdConnectAuthenticationNotifications
            {
                AuthenticationFailed = OnAuthenticationFailed
            }
        };

        app.UseOpenIdConnectAuthentication(openIdConnectAuthenticationOptions);
    }

Где может быть проблема и может ли быть простой способ исправить это?Большое спасибо за любые идеи и вклады!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...