有没有办法动态更新 Web API CORS 中允许的来源列表

Posted

技术标签:

【中文标题】有没有办法动态更新 Web API CORS 中允许的来源列表【英文标题】:Is there a way to dynamically update a list of allowed origins in Web API CORS 【发布时间】:2013-11-26 08:51:29 【问题描述】:

我正在尝试在我的 .Net Web API 应用程序中为某些域启用 CORS,并且能够通过此代码在 Application Start 上执行此操作..

public static void Register(HttpConfiguration config)

    //below comma separated string is built from database
    var domains = "http://www.myfirstdomain.com,http://www.myseconddomain.co.uk .... about 130 domains more..";
    config.EnableCors(new EnableCorsAttribute(domains, "*", "*"));

但是,如果在应用程序运行时添加了新域,则在应用程序池被回收并再次建立此列表之前,这些域将不允许跨域发布。

有什么方法可以在我的应用程序生命周期内更新此列表?我知道我可以定期回收应用程序池,但这会导致某些请求出现延迟,而我最好不要这样做。

我知道我可以在控制器方法上启用它,即..

[EnableCors("http://domain1.com,http://domain2.com", "*", "*")]
public HttpResponseMessage PostAsync([FromBody] MyRequest myRequest)

然而,逗号分隔的参数必须声明为常量,因此不能是动态的。

我是否遗漏了一些明显的东西,或者任何人都可以想到一种体面的方式来做到这一点?

编辑

这是我编写自己的自定义 EnableCors 属性的尝试。

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false)]
public class EnableCorsByDomainAttribute : Attribute, ICorsPolicyProvider

    private readonly CorsPolicy _policy;

    public EnableCorsByDomainAttribute()
    
        _policy = new CorsPolicy
        
            AllowAnyMethod = true,
            AllowAnyHeader = true
        ;

        var originsString = "http://www.test1.com,http://www.test2.com";
        if (!String.IsNullOrEmpty(originsString))
        
            foreach (var origin in originsString.Split(','))
            
                _policy.Origins.Add(origin);
            
        
    

    public Task<CorsPolicy> GetCorsPolicyAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    
        return Task.FromResult(_policy);
    

然后我用

装饰了控制器方法
[EnableCorsByDomain]

【问题讨论】:

【参考方案1】:

是的,Web API CORS 为这种场景提供了一个扩展点。您可以查看以下 Web API 功能规范文档中名为“实现自定义 ICorsPolicyProvider”的部分以了解更多详细信息。

http://aspnetwebstack.codeplex.com/wikipage?title=CORS%20support%20for%20ASP.NET%20Web%20API&referringTitle=Specs

【讨论】:

谢谢,尽管此文档需要更新,但最新的库采用不同的参数。无论如何,我似乎仍然无法正常工作,我需要一种方法来在遇到控制器方法时从我的数据库中动态加载域列表。 您是否对这一行进行了更改 config.EnableCors(defaultPolicyProvider: new EnableCorsAttribute(domains, "*", "*")); ?...如果您注意到这一行正在设置 defaultPolicyProvider 可能会覆盖您的自定义策略提供程序.. 是的,谢谢,我编辑的代码确实有效,事实证明 chrome 正在缓存对 OPTIONS 的无效调用 我想要做的不是硬编码 API 中的允许来源,而是我想将 Url 保存在数据库中并在运行时使用它。该链接非常不言自明,但并没有真正详细说明。

以上是关于有没有办法动态更新 Web API CORS 中允许的来源列表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NodeJS 14 中允许 CORS

如何在 Google Cloud Endpoints 中允许 CORS?

如何在无服务器中允许 CORS 用于自定义标头?

路径不适用于 Blazor 中允许的 IdentityServer CORS 端点,但适用于 Postman

如何解决 cors 在 vue js 和 laravel 应用程序中允许访问控制

VB.NET Web API CORS PUT 预检 405 错误