如何在 asp.net core 3.1 中为每种类型的请求启用 Cors

Posted

技术标签:

【中文标题】如何在 asp.net core 3.1 中为每种类型的请求启用 Cors【英文标题】:How to enable Cors for every type of request in asp.net core 3.1 【发布时间】:2020-06-23 10:31:08 【问题描述】:

我正在关注MS Docs,但它们似乎不起作用。

注意:我能够为特定域实现 cors,但不能针对每个域。例如,我已将以下配置应用于我的项目:

    在我添加的ConfigureServices();方法中:

    services.AddCors();

    在我添加的Configure()方法中:

    app.UseCors(builder => 建设者 .WithOrigins() .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials(); );

但是当我尝试使用 jQuery 从另一个 url 访问 API 时,我得到:

从源“https://localhost:44361”访问“https://localhost:44314/Reservation”处的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:没有“Access-Control-Allow-Origin”标头出现在请求的资源上。

现在,如果我将 URL 放入 WithOrigins() 方法中,我就可以访问 API:

app.UseCors(builder =>

    builder
    .WithOrigins("https://localhost:44361")
    .AllowAnyMethod()
    .AllowAnyHeader()
    .AllowCredentials();
);

我的问题是如何不受限制地授予对每个 URL(即域、子域等)的 API 访问权限。应用 * 不起作用。

请帮忙。

【问题讨论】:

【参考方案1】:

您需要允许您对以下内容执行的任何来源:

builder.AllowAnyOrigin()

任何具有 AllowCredentials 的来源

不允许从任何来源发送凭据是设计使然。

可以使用以下方法解决此问题

builder.SetIsOriginAllowed(_ => true)

我不认为这是一个很好的解决方案,因为它消除了 useCredentials() 的好处。

注意

useCredentials 不需要在标头中发送 JWT。如果您需要在请求中发送 cookie。允许任何来源并启用useCredentials 可能会导致安全漏洞,这就是默认情况下不允许的原因。

有关更多信息,您应该阅读

What exactly does the Access-Control-Allow-Credentials header do?

CORS: Cannot use wildcard in Access-Control-Allow-Origin when credentials flag is true

【讨论】:

我试过这个,但我在这个“:'CORS协议不允许同时指定通配符(任何)来源和凭据。如果凭据列出单个来源来配置CORS策略需要支持。'" 这是CORS设计的一部分。当您发送凭据时,您需要指定允许发送这些凭据的来源 谢谢。我还必须删除 .AllowCredentials();像你说的那样添加 builder.AllowAnyOrigin() 后它才能工作。 删除后 .AllowCredentials();我仍然能够在标头中发送 JWT 令牌,因此我认为在这种情况下不会阻止发送凭据。 AllowCredentials();据了解,适用于 cookie。我更新了我的问题以提供更多信息和两个有用问题的链接【参考方案2】:

这应该对你有好处。忽略我刚刚为您添加的 MVC 部分,以确保您的管道顺序正确

public void ConfigureServices(IServiceCollection services)

      services.AddCors();
      services.AddMvc();


public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)

    app.UseCors(
        options => options.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader()
    );

    app.UseMvc();

【讨论】:

以上是关于如何在 asp.net core 3.1 中为每种类型的请求启用 Cors的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Asp.Net Core 中为日期绑定设置文化?

如何在 ASP.NET Core 3.1 中使用 Java?

如何在 ASP.NET Core 中为 gRPC 服务添加全局异常处理 ?

如何在Asp.net Core的登录过程中为“记住我”设置单个cookie超时?

如何在 ASP.NET Core 中为同一接口配置不同的实现

如何在 ASP.NET Core 3.1 生产中配置 IdentityServer