有没有办法在 .NET Core 的 CorsPolicy 上使用“AllowAnyOrigin”属性?

Posted

技术标签:

【中文标题】有没有办法在 .NET Core 的 CorsPolicy 上使用“AllowAnyOrigin”属性?【英文标题】:Is there a way to use the 'AllowAnyOrigin' property on a CorsPolicy within .NET Core? 【发布时间】:2019-06-11 14:51:33 【问题描述】:

我目前正在开发 .Net Core 应用程序中的集成 Cors。我之前在完整的 .NET Framework (4.6.1) 中处理过 Cors,它能够在给定的 CorsPolicy 中设置 AllowAnyOrigin 属性。

如前所述,我编写了一个 .NET Core WebApi,我正在尝试在其中实现 Cors。我从存储在我的appSettings.json 中的 AppSetting 中读取它,它可以是三件事:

如果 appsetting 设置为星号,那么我希望看到 AllowAnyOrigin 属性,就像我在完整的 .NET 框架中所做的那样。 (这就是我的问题所在。) 如果 appsetting 设置为逗号分隔的字符串,例如 https://example.com, https://test.com,则会根据需要将其应用于策略。 如果应用设置已被注释掉或留空,那么我正在从 Azure 表存储读取行列表以提供给定来源的列表。

下面是我之前处理过的完整 .NET 框架的示例。

            var origins = ConfigurationManager.AppSettings[KeyCorsAllowOrigin];

            switch (origins)
            
                case null:
                    _corsPolicy.Origins.Clear();
                    foreach (var item in new StorageConfigurationManager().GetRowKeys())
                    
                        _corsPolicy.Origins.Add("https://" + item);
                    
                    break;
                case "*":
                    _corsPolicy.AllowAnyOrigin = true;
                    break;
                default:
                    _corsPolicy.AllowAnyOrigin = false;
                    if (!string.IsNullOrWhiteSpace(origins)) AddCommaSeparatedValuesToCollection(origins, _corsPolicy.Origins);
                    break;
            

我认为我可以在 .NET Core 和 Microsoft.AspNetCore.Cors.Infrastructure 包中复制此功能,但似乎 Microsoft 限制了设置该属性的访问权限,并且只能从中读取。

有谁知道设置这个的方法吗?

我知道您可以在管道中构建 CorsPolicy,然后使用 .AllowAnyOrigin(),但我目前正在使用自定义 Cors 中间件来帮助我的自定义策略。

【问题讨论】:

【参考方案1】:

只是作为所有这些的答案,因此也许有人可以通过这个问题得到帮助。我查看了 CorsPolicyBuilder 类中 AllowAnyOrigin 方法的源代码,并了解了它是如何处理的。我差点找到解决方案,只是忘记事先清除 Origins 列表。

_policy.Origins.Clear();
_policy.Origins.Add(CorsConstants.AnyOrigin);

【讨论】:

【参考方案2】:

有一篇很棒的文章叫做Enabling CORS in ASP.NET Core我会为你总结一下有趣的部分:

要仅允许对您的资源使用 GET 方法,您可以在定义 CORS 策略时使用 WithMethods 方法:

services.AddCors(options =>

    options.AddPolicy("AllowOrigin",
            builder => builder.WithOrigins("http://localhost:55294")
                              .WithMethods("GET"));
);

如果您需要允许任何来源访问资源,您将使用 AllowAnyOrigin 而不是 WithOrigins:

services.AddCors(options =>

    options.AddPolicy("AllowOrigin",
        builder => builder.AllowAnyOrigin());
);

【讨论】:

感谢您的回复!目前,我只在配置我的服务时使用services.AddCors,因为这一切都是通过我的自定义中间件完成的。这为我提供了使用策略,而不是在 AddCorsUseCors 中使用 lambda 构建它。

以上是关于有没有办法在 .NET Core 的 CorsPolicy 上使用“AllowAnyOrigin”属性?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 .NET Core 的单元测试中查看生成的日志消息?

有没有办法为 ASP.NET Core 中的内容设置通用根路径?

我正在为我的测试项目使用 MStest (.net core),有没有办法在失败时继续执行测试?

有没有办法在 Asp.Net Core Identity 中将 PasswordHash 的数据类型从字符串更改为字节数组

有没有办法将元数据添加到 ASP.NET Core 中的所有 GET 端点?

VS2019没有.net core3.0模板的解决办法