为 Web API 启用多个 CORS
Posted
技术标签:
【中文标题】为 Web API 启用多个 CORS【英文标题】:Enabling multiple CORS for Web API 【发布时间】:2016-05-11 11:37:48 【问题描述】:我有一个自己编写的 Web API 和一个使用它的应用程序。所以我通过向我的 API 中的控制器类添加标头来为该应用程序添加 CORS 标头:
[EnableCors(origins: "http://localhost:59452", headers: "*", methods: "*")]
以上工作正常。现在我还想要更多使用该 Web API 的应用程序。我的问题是如何做到这一点?
【问题讨论】:
【参考方案1】:您可以通过逗号分隔来添加多个来源:
[EnableCors(origins: "http://localhost:59452,http://localhost:25495,http://localhost:8080", headers: "*", methods: "*")]
【讨论】:
这是当前的方法吗?我看到其他问题/答案,用户必须创建大量代码才能实现它。 @Sean Bright 我可以使用 origins:"*" 来允许任何域吗? Chrome 和其他人阻止了这一点,抛出一个关于多个值的错误,并且只允许一个。【参考方案2】:Sean 的回答对于简单的场景来说已经足够了,但是请注意属性参数必须是一个常量表达式,所以你不能说[EnableCors(origins:GetAllowedOrigins()...
如果客户改变了他们的来源或者你需要添加一个新的你需要进行代码更改并将站点重新部署到服务器。
作为替代方案,您可以在 WebApiConfig.cs
Register()
方法中启用 CORS。这会全局启用 CORS,但允许您动态设置允许的来源。这允许您在数据库中维护允许的来源列表,例如和可以根据需要进行更新。您仍然需要在进行任何更改后重新启动 Web 应用程序,但无需更改代码:
public static class WebApiConfig
private static string GetAllowedOrigins()
//Make a call to the database to get allowed origins and convert to a comma separated string
return "http://www.example.com,http://localhost:59452,http://localhost:25495";
public static void Register(HttpConfiguration config)
string origins = GetAllowedOrigins();
var cors = new EnableCorsAttribute(origins, "*", "*");
config.EnableCors(cors);
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/controller/id",
defaults: new id = RouteParameter.Optional
);
【讨论】:
有没有办法为未全局启用的特定操作动态使用 AllowedOrigins 列表??? @Moes,您可以创建一个自定义属性来实现 ICorsPolicyProvider 并从配置、数据库等获取来源 - 您想要的任何来源。 这是否解决了 Chrome 在列表中只允许一个来源时抛出适合多个来源的问题?【参考方案3】:我怀疑这取决于请求者。根据this MS article,只允许一个来源。上面建议的逗号分隔字符串方法似乎适用于test-cors,但不适用于an SPFx web part。
此外,通配符 (*) 来源在包含 cookie/凭据的情况下也不起作用(至少在 SPFx 中)。
【讨论】:
以上是关于为 Web API 启用多个 CORS的主要内容,如果未能解决你的问题,请参考以下文章