В вашем примере вы настроили две вещи при настройке WebHost:
- Создали пользовательскую политику CORS с именем
AllowCors
. - Добавили промежуточное ПО CORSк конвейеру, который использует
AllowCors
в качестве policyName
.
Вот фрагмент функции Invoke
, которая вызывается для промежуточного программного обеспечения CORS:
public async Task Invoke(HttpContext context)
{
if (context.Request.Headers.ContainsKey(CorsConstants.Origin))
{
var corsPolicy = _policy ?? await _corsPolicyProvider?.GetPolicyAsync(context, _corsPolicyName);
if (corsPolicy != null)
{
var corsResult = _corsService.EvaluatePolicy(context, corsPolicy);
_corsService.ApplyResult(corsResult, context.Response);
...
В этом фрагменте _policy
равно null
, а _corsPolicyName
равно AllowCors
.Поскольку AllowCors
- это имя действительной политики, добавленной с использованием AddCors
, это приводит к тому, что промежуточное программное обеспечение CORS применяет соответствующие заголовки CORS для всех запросов .
В вашем примереВы также использовали [EnableCors(...)]
и [DisableCors]
, которые являются фильтрами авторизации MVC.Делая это, вы в основном просто говорите MVC позаботиться о CORS, который является независимым промежуточным ПО CORS, которое вы добавили в конвейер WebHost.
Эта комбинация MVC иПромежуточное программное обеспечение CORS - это то, что вызывает ваши неожиданные результаты.Промежуточное программное обеспечение добавляет заголовки CORS к вашему запросу независимо от того, или нет, с помощью атрибута [DisableCors]
вы запрашиваете или нет - промежуточное программное обеспечение CORS не подозревает, что это понятие MVC (фильтр)даже существует.
На основании этой информации вы можете решить вашу проблему одним из двух способов:
- Удалить параметр
policyName
из вашего вызова на UseCors
. - Удалите сам вызов
UseCors
.
При использовании опции 1 промежуточное программное обеспечение UseCors
будет использовать политику по умолчанию, если оно настроено с использованием AddDefaultPolicy
на переданном CorsOptions
в делегат AddCors
.
При выборе варианта 2 промежуточное программное обеспечение CORS просто исключается из конвейера.Это также будет работать в вашем примере, потому что вы использовали [EnableCors(...)]
там, где вам это нужно.Это также означает, что вам вообще не нужно использовать [DisableCors]
- по умолчанию не будет добавляться заголовок CORS.
Возникает вопрос: когда будет [DisableCors]
быть полезным?В качестве примера рассмотрим следующий базовый контроллер:
[EnableCors("AllowCors")]
public class ExampleController : ControllerBase
{
public IActionResult Action1() =>
...
public IActionResult Action2() =>
...
}
Понятно, что в этом примере и Action1
, и Action2
будут устанавливать заголовки CORS.Если вы не не хотите Action2
установить заголовки, вы можете пометить его с помощью [DisableCors]
.