【问题标题】:Is there a way to use the 'AllowAnyOrigin' property on a CorsPolicy within .NET Core?有没有办法在 .NET Core 的 CorsPolicy 上使用“AllowAnyOrigin”属性?
【发布时间】: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 中间件来帮助我的自定义策略。

【问题讨论】:

    标签: c# .net-core 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 构建它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      • 1970-01-01
      • 2020-10-29
      • 2014-11-08
      • 1970-01-01
      • 1970-01-01
      • 2019-07-07
      相关资源
      最近更新 更多