CORS (Cross-origin resource sharing — «совместное использование ресурсов между разными источниками») — это технология современных браузеров, которая позволяет предоставить веб-страницам доступ к ресурсам другого домена. По умолчанию веб-браузеры в целях безопасности ограничивают ajax-запросы между различными доменами и такое поведение, иногда, может оказаться неприемлемым для наших приложений ASP.NET Core. В этом случае мы должны использовать возможности платформы ASP.NET Core для настройки CORS в своем приложении.
Демонстрация проблемы с CORS
Допустим, мы разрабатываем приложение Web API, которое должно взаимодействовать с различными клиентами в Сети и возвращать JSON-объекты. Пусть оно будет таким:
namespace AspCorsSource
{
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => Results.Ok(new { name = "Tom", age=25, organization = "Microsoft"}));
app.Run();
}
}
}
если мы запустим это приложение, то сразу увидим JSON-объект, содержащий три пары:
Теперь, появляется новый клиент нашего API, который разрабатывает свой проект, используя AJAX и всякие другие крутые вещи и пишет следующее приложение:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>API Client</title>
</head>
<body>
<h2 id="result"></h2>
<button id="btn" value="Запрос">Запрос</button>
<script>
const btn = document.getElementById("btn");
const result = document.getElementById("result");
btn.addEventListener("click", async () => {
try {
const response = await fetch("http://localhost:5000/");
if (response.ok) result.innerText = await response.text();
}
catch (e) {
result.innerText = e.message;
}
});
</script>
</body>
</html>
По сути, в этом приложении нет ничего сложного — мы просто запрашиваем главную страницу нашего API и ожидаем увидеть всё тот же JSON. Но так как браузер использует по умолчанию CORS, то клиент увидит следующее:
Собственно, это и есть демонстрация проблемы использования CORS при разработке веб-приложений, которая может вызвать немало бессонных ночей у начинающих разработчиков. Рассмотрим, как мы можем обойти эту проблему в ASP.NET Core и настроить в своем приложении CORS
Использование CORS в ASP.NET Core
Изменим наш проект API следующим образом:
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddCors(); //добавляем сервис CORS
var app = builder.Build();
app.UseCors(options=>options.AllowAnyOrigin()); //используем middleware для CORS
app.MapGet("/", () => Results.Ok(new { name = "Tom", age=25, organization = "Microsoft"}));
app.Run();
}
}
Здесь мы подключили сервис для работы CORS:
builder.Services.AddCors();
и встроили в конвейер обработки запроса компонент middleware для использования CORS
app.UseCors(options=>options.AllowAnyOrigin());
Для конфигурации параметров CORS метод UseCors() использует делегат, в который передается объект типа CorsPolicyBuilder с помощью которого можно выполнить настройку CORS. Так, в нашем приложении мы использовали настройку:
options=>options.AllowAnyOrigin()
указав тем самым, что наше приложение может обрабатывать запросы с любых доменов и адресов.
Проверим теперь работу нашего приложения и клиента. Запускаем приложение API:
Теперь отправим запрос с клиента:
Как можно видеть на скриншоте — запрос прошел успешно и клиент получил ответ с JSON-объектом от сервера.
Итого
По умолчанию, современные браузеры, в целях безопасности, запрещают кросс-доменные AJAX-запросы, что может вызвать проблемы при взаимодействии приложений ASP.NET Core с другими веб-приложениями. Чтобы разрешить кросс-доменные запросы в ASP.NET Core нам необходимо задействовать CORS — добавить в приложение сервис для работы с CORS и добавить в конвейер обработки запросов компонент middleware для использования CORS.


