Как включить CORS в ядре ASP.NET
Я пытаюсь разрешить совместное использование ресурсов перекрестного происхождения в моем ASP.NET Core Web API, но я застрял.
Атрибут EnableCors
принимает policyName
типа string
как параметр:
// Summary:
// Creates a new instance of the Microsoft.AspNetCore.Cors.Core.EnableCorsAttribute.
//
// Parameters:
// policyName:
// The name of the policy to be applied.
public EnableCorsAttribute(string policyName);
Что означает policyName
и как я могу настроить CORS в базовом веб-API ASP.NET?
Ответы
Ответ 1
Необходимо настроить политику CORS при запуске приложения в методе ConfigureServices
:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
}));
// ...
}
CorsPolicyBuilder
в builder
позволяет вам настроить политику в соответствии с вашими потребностями. Теперь вы можете использовать это имя для применения политики к контроллерам и действиям:
[EnableCors("MyPolicy")]
Или примените его к каждому запросу:
public void Configure(IApplicationBuilder app)
{
app.UseCors("MyPolicy");
// ...
// This should always be called last to ensure that
// middleware is registered in the correct order.
app.UseMvc();
}
Ответ 2
Относится к .NET Core 1 и .Net Core 2 (далее)
При использовании .Net-Core 1.1
К сожалению, документы в этом конкретном случае очень запутаны. Так что я сделаю это очень просто:
Это. Каждый клиент имеет доступ к вашему основному веб-сайту/API ASP.NET.
При использовании .Net-Core 2.0
- Добавьте пакет
Microsoft.AspNetCore.Cors
nuget в свой проект
в методе ConfigureServices
перед вызовом services.AddMvc()
добавьте:
services.AddCors(options =>
{
options.AddPolicy("AllowAll",
builder =>
{
builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials();
});
});
(Важно) В методе Configure
, перед вызовом app.UseMvc()
, добавьте app.UseCors("AllowAll");
AllowAll
- это имя политики, которое мы должны упомянуть в app.UserCors. Это может быть любое имя.
Ответ 3
Основываясь на ответе Henk, я смог найти конкретный домен, метод, который я хочу разрешить, а также заголовок, который я хочу включить CORS для:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
options.AddPolicy("AllowSpecific", p => p.WithOrigins("http://localhost:1233")
.WithMethods("GET")
.WithHeaders("name")));
services.AddMvc();
}
использование:
[EnableCors("AllowSpecific")]
Ответ 4
В частности, в dotnet core 2.2 с SignalR вы должны изменить
.WithOrigins("http://localhost:3000")
или
.SetIsOriginAllowed(isOriginAllowed: _ => true) //for all origins
вместо этого .AllowAnyOrigin()
с .AllowCredentials()
https://trailheadtechnology.com/breaking-change-in-aspnetcore-2-2-for-signalr-and-cors/
https://github.com/aspnet/AspNetCore/issues/4483
Ответ 5
Вы должны настроить в классе Startup.cs
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy",
builder => builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
});
Ответ 6
`
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy("AllowAnyOrigin",
builder => builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader());
});
services.Configure<MvcOptions>(options => {
options.Filters.Add(new CorsAuthorizationFilterFactory("AllowAnyOrigin"));
});
}
`
Ответ 7
Если вы размещаете на IIS, одна из возможных причин заключается в том, что вы получаете это потому, что IIS блокирует глагол OPTIONS
. Из-за этого я провел почти час:
Один контрольный сигнал - вы получаете ошибку 404
во время запроса OPTIONS
.
Чтобы исправить это, вам необходимо явно указать IIS не блокировать запрос OPTIONS
.
Перейти к фильтрации запросов:
![IIS Request Filtering]()
Убедитесь, что разрешены опции:
![Make sure OPTIONS is True]()
Или просто создайте web.config
со следующей настройкой:
<system.webServer>
<security>
<requestFiltering>
<verbs>
<remove verb="OPTIONS" />
<add verb="OPTIONS" allowed="true" />
</verbs>
</requestFiltering>
</security>
</system.webServer>