Я разрабатываю новую функцию для существующего приложения 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
. Меня особенно смущают две вещи:
- Почемупроблема возникает только с MS Edge?
- Почему проблема не возникает в запросе на просмотр (который успешно загружен), который также должен сделать обход провайдеру аутентификации.
Как и предлагалось другими решениями (как при включении, так и при отключении стека), я попытался установить "app.UseCors" в Startup.Auth.cs, но без каких-либо заметных изменений.
@ LinuxDisciple заметил, что вЗапросы API, показанные ниже, Chrome отправляет cookie (уже аутентифицирован), а Edge - нет.Такое поведение Edge является неожиданным, поскольку аутентификация должна быть успешной по запросу для представления, которое происходит непосредственно перед запросом к API, поэтому ожидается, что клиент всегда уже имеет действительный сеанс после вызова API.Таким образом, это может привести к тому, что запрос API-интерфейса Edge не отправляет cookie-файл ... При попытке прямого доступа к URL-адресу API-интерфейса форма входа отображается правильно, и все работает, как и ожидалось, но в сочетании с предварительным вызовом View.Я получаю сообщение об ошибке, показанное здесь.
Дополнительная информация Диаграмма последовательности операций для потока запросов (к этой проблеме относится только нижняя половина)
Снимок экрана с запросом API в Microsoft Edge, который останавливается при перенаправлении к поставщику аутентификации:
Для сравнения снимок экрана точно такого же запроса вGoogle Chrome:
Код 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);
}
Где может быть проблема и может ли быть простой способ исправить это?Большое спасибо за любые идеи и вклады!