为Web API启用多个CORS

时间:2016-02-02 15:22:37

标签: asp.net-web-api cors

我有一个我编写的Web API和一个使用它的应用程序。因此,我通过在API中向控制器类添加标头来为该应用程序添加CORS标头:

[EnableCors(origins: "http://localhost:59452", headers: "*", methods: "*")]

以上工作正常。现在我还想要更多的应用程序使用该Web API。我的问题是如何实现这一目标?

3 个答案:

答案 0 :(得分:18)

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 }
        );
    }
}

答案 1 :(得分:16)

您可以使用逗号分隔多个来源:

$x = $_GET["x"];
$y = $_GET["y"];
printf("%f<br>", $x*$y);

答案 2 :(得分:1)

我怀疑这取决于请求者。根据{{​​3}},只允许一个来源。上面建议的逗号分隔字符串方法似乎适用于this MS article,但不适用于test-cors

在包含cookie /凭证的情况下(至少在SPFx中),通配符(*)来源也不起作用。
an SPFx web part