我们最近将一个API应用程序从Azure云服务迁移到Azure网站,一些客户端仍在使用我们的旧协议进行身份验证,该协议使用cookie(而不是通常的Authorization: Bearer
HTTP标头)。我们需要支持此身份验证协议一段时间,因为客户端无法立即迁移。
为了支持针对API的跨源ajax请求中的cookie,客户端需要在XMLHttpRequest中将withCredentials
设置为true
,并且服务器需要使用{{ 1}}标题以及任何CORS请求。
我们面临的问题是Azure网站自行管理CORS,并使用自己的配置(限于允许的来源列表)进行响应,这不允许设置此标头...从而破坏了我们所有Ajax客户端的应用程序!
有没有办法(临时)在回复中添加此标题?
答案 0 :(得分:17)
我们终于了解了Azure Apps CORS中间件的行为。要禁用它,您必须清除Web应用程序的CORS刀片中的每个允许的原始条目(包括*
)。然后,您可以自己管理CORS,使用Web Api 2功能或使用web.config。
这些信息甚至可以在the documentation中找到:
请勿尝试在一个API应用中同时使用Web API CORS和App Service CORS。 App Service CORS优先,Web API CORS不起作用。例如,如果在App Service中启用一个源域,并在Web API代码中启用所有源域,则Azure API应用程序将仅接受来自您在Azure中指定的域的调用。
所以最终的答案是:如果您的应用程序不需要非常具体的CORS管理,您可以使用Azure App Service CORS。否则,您需要自己处理它并禁用Web应用程序中的所有CORS配置。
答案 1 :(得分:1)
这是您可以在Web应用程序中提供的web.config文件中执行的操作。
您可以使用Visual Studio Online(Monaco)编辑它,这是您从Azure门户添加的工具。
在此处阅读更多内容:http://enable-cors.org/server_iis7.html
答案 2 :(得分:1)
Azure App Service CORS功能现在支持此功能。 不幸的是,目前还没有UX,因此启用它会有些痛苦。目前有两种简单的方法。
在Azure门户上,导航到您的Web应用。导航对API> CORS。现在有一个Enable Access-Control-Allow-Credentials
的复选框。选中此框,然后按Save
。
通过以下命令使用Azure CLI:
az resource update --name web --resource-group myResourceGroup --namespace Microsoft.Web --resource-type config --parent sites/<app_name> --set properties.cors.supportCredentials=true --api-version 2015-06-01
您可以查看更多文档here。
注意:这不适用于*
作为允许的来源。这是我们决定做出的安全选择。