Aspnetcore: 如果在没有源头的情况下请求对启用 CORS 的端点的请求,则为 HTTP 500

创建于 2019-04-13  ·  3评论  ·  资料来源: dotnet/aspnetcore

描述错误

如果对未指定origin HTTP 请求标头的启用 CORS 的端点发出 HTTP 请求,则请求将失败并显示 HTTP 500 错误。

日志中的异常是:

[2019-04-13 14:40:04Z] fail: Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[1]
      An unhandled exception has occurred while executing the request.
System.InvalidOperationException: Endpoint MartinCostello.Api.Controllers.TimeController.Get (API) contains CORS metadata, but a middleware was not found that supports CORS.
Configure your application startup by adding app.UseCors() inside the call to Configure(..) in the application startup code.
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.ThrowMissingCorsMiddlewareException(Endpoint endpoint)
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.HttpOverrides.HttpMethodOverrideMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

但是, app.Cors() _has_ 已在app.UseEndpoints(...)之前添加到应用程序中。

这似乎是由#9181 引入的。

如果请求没有origin请求头,则跳过 CORS 中间件:

https://github.com/aspnet/AspNetCore/blob/b93bc433db66175d2b07b128ec9990f7a4dd7e1b/src/Middleware/CORS/src/Infrastructure/CorsMiddleware.cs#L122 -L125

但是,端点中间件会在被调用的端点上找到 CORS 元数据,并通过在HttpContext查找键来检查 CORS 中间件是否被调用(它确实被调用了,但被跳过了不需要)项目。 该项目不存在,因此抛出异常:

https://github.com/aspnet/AspNetCore/blob/84da613d2c03b6f1c0fa3c01828923ec3415d525/src/Http/Routing/src/EndpointMiddleware.cs#L51 -L55

仅当origin标头存在于请求中时才会添加端点中间件正在测试的密钥,该标头位于此处:

https://github.com/aspnet/AspNetCore/blob/b93bc433db66175d2b07b128ec9990f7a4dd7e1b/src/Middleware/CORS/src/Infrastructure/CorsMiddleware.cs#L140 -L141

似乎有两种可能的修复方法是:

  1. CORS 中间件总是将 "Ive run" 值添加到HttpContext.Items ,或者:
  2. 如果 CORS 元数据存在于端点上,端点中间件 _also_ 检查origin标头,并且仅在 HTTP 请求中存在 CORS 中间件未调用时抛出异常。

再现

  1. 配置 ASP.NET Core MVC 应用程序以使用 CORS。
  2. [EnableCors(...)]属性添加到控制器方法。
  3. 启动应用程序。
  4. 对端点执行标准 HTTP 请求(例如使用 cURL)。

预期行为

如果没有提供origin HTTP 请求头,则请求成功。

附加上下文

.NET Core SDK (reflecting any global.json):
 Version:   3.0.100-preview4-011204
 Commit:    621575bab1

Runtime Environment:
 OS Name:     Windows
 OS Version:  10.0.17763
 OS Platform: Windows
 RID:         win10-x64
 Base Path:   C:\Program Files\dotnet\sdk\3.0.100-preview4-011204\

Host (useful for support):
  Version: 3.0.0-preview4-27612-09
  Commit:  64e9c3e1cd
Done area-mvc bug

最有用的评论

对于 preview4,可能的解决方法包括:

1) 有一个中间件,在UseCors()之后设置HttpContext.Items的值

```C#
app.UseCors();

app.Use((context, next) =>
{
context.Items["__CorsMiddlewareInvoked"] = true;
返回下一个();
});


2) Disable the check in `EndpointRouting`:
```C#
services.AddRouting(r => r.SuppressCheckForUnhandledSecurityMetadata = true);

第一个将是首选,因为它不会删除对错误配置应用程序的检查。

所有3条评论

作为向简单沙盒应用程序提交此提交的一部分,发现了问题: https :

抄送@pranavkm

对于 preview4,可能的解决方法包括:

1) 有一个中间件,在UseCors()之后设置HttpContext.Items的值

```C#
app.UseCors();

app.Use((context, next) =>
{
context.Items["__CorsMiddlewareInvoked"] = true;
返回下一个();
});


2) Disable the check in `EndpointRouting`:
```C#
services.AddRouting(r => r.SuppressCheckForUnhandledSecurityMetadata = true);

第一个将是首选,因为它不会删除对错误配置应用程序的检查。

此页面是否有帮助?
0 / 5 - 0 等级