Содержание
В предыдущей части мы познакомились с технологией CORS и использовали её в нашем приложении ASP.NET Core для того, чтобы позволить другому приложению получать доступ к ресурсам. В этой части мы более детально рассмотрим CORS и то, как можно конфигурировать работу CORS в ASP.NET Core.
Методы CorsPolicyBuilder
В предыдущей части, в вызове app.UseCors() мы настроили конфигурацию CORS следующим образом:
app.UseCors(options=>options.AllowAnyOrigin());
тем самым, разрешив запросы со всех адресов/хостов. При этом, в классе CorsPolicyBuilder имеется ряд других полезных методом, позволяющих более точно настроить CORS, а именно:
Allow |
Принимаются запросы с любыми заголовками |
Allow |
Принимаются любые HTTP-методы(GET/POST/PUT и т.д.) |
Allow |
Принимаются запросы от любых источников (с любого хоста/адреса) |
Allow |
Допускается принимать учётные данные от пользователей, например аутентификационные куки |
Disallow |
Запрещает принимать учётные данные от пользователей |
With |
Принимаются только те запросы, которые содержат определенные заголовки |
With |
Принимаются только указанные HTTP-методы |
With |
Запросы принимаются только от указанных источников |
Например, на данный момент наше приложение принимает запросы от любых источников:
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 напишем такой клиент для выполнения запросов к нашему приложению:
namespace AspCorsConsumer
{
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient();
var app = builder.Build();
app.UseDefaultFiles();
app.UseStaticFiles();
app.Run();
}
}
}
и добавим в папку wwwroot файл index.html, который мы создали ранее:
<!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>
По сути, мы пока ничего не поменяли во взаимодействии двух приложений. Теперь изменим код основного приложения следующим образом:
app.UseCors(options => options.WithOrigins(new[] { "http://localhost:5033"}));
здесь мы указываем, что разрешаем получать запросы от указанного источника — http://localhost:5033. Запустим приложение API:
теперь запустим клиент:
Пробуем выполнить запрос к API:
Запрос был отклонен, так как указанный в политике CORS допустимый источник не соответствует источнику с которого произошел запрос. Попробуем открыть наше приложение по адресу без https — это второй адрес http://localhost:5033/
Запрос прошел успешно. Аналогичным образом могут использоваться и другие методы CorsPolicyBuilder для настройки конфигурации CORS в ASP.NET Core. При этом, мы можем вызывать несколько методов для более точной настройки CORS, например:
app.UseCors(options => options.WithOrigins("https://localhost:7264")
.AllowAnyHeader()
.WithMethods("GET"));
Итого
Конфигурирование CORS осуществляется в методе UseCors() с помощью методов объекта CorsPolicyBuilder. Так, мы можем указать перечень источников (адресов) с которых могут обрабатываться кросс-доменные запросы, определить перечень допустимых методов и т.д.




