在 ASP.Net Core 5 WebAPI 中启用 CORS

2024-01-27

有数百万篇文章和问题与此问题相关,但我找不到我的代码有什么问题。我有Startup, StartupProduction, and StartupDevelopment如下。另外,我正在使用ASP.Net Core 5,并基于文档 https://learn.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-5.0#enable-cors-with-endpoint-routing我认为我这样做是正确的。

仅供参考,起初,我使用AllowAnyOrigin用于开发,但我也测试.WithOrigins("http://localhost:3000")而且效果很好。我的后端运行在https://localhost:44353正在开发和正在开发中https://api.example.com在生产中。

public class Startup
{
    protected const string CorsPolicyName = "CorsPolicyName";

    public virtual void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers()
            .AddJsonOptions(options =>
            {
                options.JsonSerializerOptions.Converters.Add(
                    new System.Text.Json.Serialization.JsonStringEnumConverter());
            });

        services.AddABunchOfOtherServices();
    }

    public virtual void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseRouting();
        app.UseCors(CorsPolicyName);
        app.UseAuthentication();
        app.UseAuthorization();

        app.UseMiddleware<CheckUserConfirmedMiddleware>();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute
            (
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}"
            )
            .RequireCors(CorsPolicyName);
        });
    }
}

public class StartupProduction : Startup
{
    public override void ConfigureServices(IServiceCollection services)
    {
        services.AddCors(options =>
        {
            options.AddPolicy(
                CorsPolicyName,
                policy => policy
                    .WithOrigins("https://example.com", "http://example.com")
                    //.WithOrigins(Configuration.GetValue<string>("AllowedHosts").Split(';').ToArray())
                    .AllowAnyMethod()
                    .AllowAnyHeader());
        });

        base.ConfigureServices(services);
    }

    public override void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseMiddleware(typeof(ErrorHandlingMiddleware));

        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();

        base.Configure(app, env);
    }
}

public class StartupDevelopment : Startup
{
    public override void ConfigureServices(IServiceCollection services)
    {
        services.AddCors(options =>
            options.AddPolicy(
                CorsPolicyName,
                policy =>
                    policy
                        //.AllowAnyOrigin()
                        .WithOrigins("http://localhost:3000")
                        .AllowAnyMethod()
                        .AllowAnyHeader()
            )
        );

        base.ConfigureServices(services);

        services.AddSwaggerGen(....);
    }

    public override void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseMiddleware<DevelopmentErrorHandlingMiddleware>();

        base.Configure(app, env);

        app.UseSwagger();

        app.UseSwaggerUI(options =>
        {
            options.SwaggerEndpoint("swagger/v1/swagger.json", "API v1");
            options.RoutePrefix = string.Empty;
        });
    }
}

我也尝试过默认策略 https://learn.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-5.0#cors-with-default-policy-and-middleware.

Update

我已经设置了Environment to Production在 Visual Studio 中对其进行调试,现在我在开发中面临同样的问题。

从源“http://localhost:3000”获取“https://localhost:44353/api/v1/User”的访问已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:否请求的资源上存在“Access-Control-Allow-Origin”标头。如果不透明响应满足您的需求,请将请求模式设置为“no-cors”以在禁用 CORS 的情况下获取资源。

解决方案

我注意到是 IIS 阻止了该请求。它仅在我有时才有效"AllowedHosts": "*", in my appsettings.json。因此,作为解决方法,我添加了"MyRandomKey": "https://example.com", in my appsettings.json并在我的中使用以下内容Startup.

services.AddCors(options =>
                options.AddPolicy(
                    CorsPolicyName,
                    policy =>
                        policy
                            .WithOrigins(Configuration.GetValue<string>("MyRandomKey").Split(";").ToArray())
                            .AllowAnyMethod()
                            .AllowAnyHeader()
                )
            );

AllowedHosts 和 CORS 不同。

AllowedHosts 用于主机过滤,因此即使您在应用程序中配置了 CORS 策略但不允许主机,IIS 也会拒绝该请求。

请参考这个链接:appsettings.json 中的AllowedHosts 和.NET Core API 3.x 中的UseCors 之间的区别 https://stackoverflow.com/questions/59750012/difference-between-allowedhosts-in-appsettings-json-and-usecors-in-net-core-api

默认情况下它是*,但您可以根据您的要求将其更改为。 在您的情况下,您可以设置“api.example.com”,或者如果您还想允许来自本地主机,则可以设置“api.example.com;localhost”。 设置完成后,IIS 将开始接受来自这些域的请求。

一旦 IIS 开始接受请求,您的应用程序级别配置的 CORS 策略将被应用并发挥作用。 所以基本上 CORS 是允许访问 WebAPI 中的资源。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 ASP.Net Core 5 WebAPI 中启用 CORS 的相关文章

随机推荐

  • Keras 中预测的流输出

    我在 Keras 中有一个 LSTM 我正在训练它来预测时间序列数据 我希望网络在每个时间步上输出预测 因为它将每 15 秒收到一个新输入 所以我正在努力解决的是训练它的正确方法 以便它在接收 x 0 x 1 x t 作为输入流时将输出 h
  • Javac 调试打开和关闭之间有性能差异吗?

    如果我打开使用 Javac 生成调试信息 则类文件会增大 20 25 这对运行 Java 程序有任何性能影响吗 如果是的话 什么条件以及多少 我预计对加载类会有一点影响 因为文件较大 但这应该是最小的 在任何语言中 调试信息都是元信息 它本
  • 如何将 HTML 转换为 XHTML? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我需要将 HTML 文档转换为有效的 XML 最好是 XHTML 最好的方法是什么 有人知道工具包 库 样本 任何可以帮助我完成任务的东西
  • 每次查询后关闭 MySQL 连接

    在挖掘一位我敬佩的前同事整理的一些旧代码时 我注意到每次查询后他们都会关闭 MySQL 服务器的连接 这看起来有点奇怪 因为我总是在页面末尾关闭它 并且看到大多数人都这样做 那么问题来了 这是 PHP MySQL 中最好的想法吗 无论如何
  • 使用 Bash 获取一对 HTML 标签之间的内容

    我需要使用 bash 脚本获取一对给定标签之间的 HTML 内容 作为示例 具有以下 HTML 代码 text div text2 div text3 div div 使用 bash 命令 脚本 给定body标签 我们会得到 text di
  • 在 Windows 上分配开始失败之前检测内存运行不足

    我们有一个应用程序可能会分配大量小对象 取决于用户输入 有时应用程序会耗尽内存并导致崩溃 然而 如果我们知道内存分配变得紧张 那么一些优先级较低的对象可能会被销毁 从而允许我们优雅地降低用户结果 在调用 new 实际失败之前检测进程内存不足
  • 从 Metro 应用程序检测桌面可用性(检测 ARM、检测 Windows RT 系统)

    这是一个相关的问题在 WinRT Metro 应用程序 C 中获取操作系统版本 https stackoverflow com questions 10125324 get os version in winrt metro app c s
  • 如何在c#中从arraylist中检索对象

    如何在 C 中从 arraylist 中检索对象及其成员 你的意思是这样吗 ArrayList list new ArrayList YourObject myObject new YourObject list Add myObject
  • AJAX、子域和 SSL

    我有一个网站 foo com 它向 bar foo com 发出 ajax 请求 这行得通吗 另外 如果 foo 是安全连接 https 那么 bar foo com 也需要是 https 吗 这两个站点可以使用不同的证书吗 使用纯 htt
  • 在 cygwin 中运行简单的 map-reduce hadoop 示例时出现问题

    我只是想在独立模式下运行 64 位 Windows 7 的笔记本电脑上运行 Hadoop 我已将 Cygwin 1 7 安装在默认文件夹 c cygwin 中 我在文件夹 c jdk1 7 0 03 中有最新的 JDK 并设置了 JAVA
  • 如何使用Antlr实现函数调用,以便在定义之前就可以调用它?

    一旦构建了 AST 实现树遍历器以便可以按任意顺序定义和调用函数的最佳方法是什么 例如 这在 PHP 中是有效的 我猜想一定有第二遍 或者树转换 但我在这个主题上找不到任何有趣的东西 这个问题可能不是 Antlr 特有的问题 但如果你能给我
  • Mongoid,如何通过references_one关联(以及后续关联)来order_by?

    简单模型 class hat embedded in owner field color end class owner embedds one hat referenced in house field name end class ho
  • 基于 step() 的用户定义函数给出: eval(expr, envir, enclos) 中的错误:未找到对象“X”

    我正在尝试构建一个包含以下内容的函数ordiR2step 函数从vegan包裹 该函数基于step 功能 这是在函数之外完美运行的代码 install packages vegan require vegan data mite data
  • String.scan 和 String.split 之间的区别

    这两个有什么区别 String scan and String split 在红宝石中 它们服务于完全不同的目的 String scan http www ruby doc org core 1 9 3 String html method
  • 在子窗口上打开打印预览模式时,Google Chrome 会阻止 ajax 请求(如何解决?)

    问题 在子窗口上打开打印预览模式时 Google Chrome 会阻止 ajax 请求 细节 我有一个网页 ParentPage html 其中包含指向子页面 PrintPage html 的链接 a href PrintPage html
  • Web 应用程序中支持动画光标吗?

    是否有网络浏览器支持动画光标 我一直在网络上搜索以将自定义光标添加到我的网络应用程序中 我已经找到了很多非动画 cur 和动画 ani 光标 并使用了正确的 CSS 以便我的应用程序具有自定义光标 我尝试过的网络浏览器似乎不支持动画光标 我
  • .PublishLast() 的用例(以前称为 Prune)

    在我看来 我对 RX 函数有很好的 感觉 我使用了其中的许多函数 或者可以想象其他函数如何有用 但我找不到 Prune 函数的位置 我知道这是对 AsyncSubject 的多播 但是这在实际场景中有何用处 编辑 Richard 说 Web
  • MongoDB - Java 驱动程序性能

    这是我的环境 Java Oracle 的 1 7 mongod v2 4 5 在 Mongolab 中 我发现两个 MongoDB 驱动程序的性能存在差异 2 9 3 与 2 11 2 当我使用每个驱动程序运行相同的代码时 2 11 2 比
  • 如何获取两个S3存储桶之间的文件差异?

    因此 我有一个 S3 视频桶 数百个 我使用 Elastic Transcoder 将所有内容转码到第二个优化的桶中 但是 当我检查第二个存储桶时 发现少了 40 50 个对象 但我无法弄清楚它们是什么 目录结构深度嵌套等 如何使用以下命令
  • 在 ASP.Net Core 5 WebAPI 中启用 CORS

    有数百万篇文章和问题与此问题相关 但我找不到我的代码有什么问题 我有Startup StartupProduction and StartupDevelopment如下 另外 我正在使用ASP Net Core 5 并基于文档 https