是否可以在.NET Core的CorsPolicy上使用'AllowAnyOrigin'属性?

时间:2019-01-17 11:52:05

标签: c# .net-core cors

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

就像前面提到的,我编写了一个.NET Core WebApi,我正在尝试将Cors实现到其中。我从存储在appSettings.json中的AppSetting中读取内容,从中可以得出以下三点:

  • 如果将appsetting设置为星号,那么我希望像在完整的.NET框架中一样看到AllowAnyOrigin属性。 (这是我的问题所在。)
  • 如果将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中间件来帮助我的自定义策略。

2 个答案:

答案 0 :(得分:0)

有一篇很棒的文章叫做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());
});

答案 1 :(得分:0)

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

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