如何通过在 IIS 8 中使用“Access-Control-Allow-Origin”来允许多个域

Posted

技术标签:

【中文标题】如何通过在 IIS 8 中使用“Access-Control-Allow-Origin”来允许多个域【英文标题】:How can I allow multiple domains by using "Access-Control-Allow-Origin" in IIS 8 【发布时间】:2015-09-04 06:26:23 【问题描述】:

经过几个小时的阅读,我发现 IIS 不支持多个"Access-Control-Allow-Origin" 标头。

也不允许使用"*" 设置值,但错误:

不能在“Access-Control-Allow-Origin”中使用通配符“*” 当凭证标志为真时标头。因此,原点“空”是 不允许访问。

其他 SO 问题提出了解决方案,例如 this 一个或 this 一个,但我不知道我必须在哪里更改标题。

我的应用程序是用 .NET 编写的,我使用的是 IIS 8.5。我的目标是对多个源域进行 CORS 请求。我必须写一个IHttpModule 来处理源头吗?

【问题讨论】:

为什么您需要凭据和多个来源? @ErikFunkenbusch 因为一个页面发出另一个请求,但如果未经身份验证则不允许。 我不明白你的意思......你将不得不更具描述性。 @ErikFunkenbusch 我的意思是我有来自域 A、B、C 的 CORS 请求。在 web.config 中,您只需添加一个 ACAO <add name="Access-Control-Allow-Origin" value="www.domainA.com" /> 我需要的不仅仅是域 A!因此,我必须将更改后的原始标头发回以接受多个域。如果我将值更改为*,则 CORS 请求在客户端不起作用 - e。 G。 Google Chrome、FireFox 等。 那仍然没有回答我的问题。你为什么需要这个?我没有问你需要什么,我问你为什么需要它。标准不允许。你无法改变这一点。唯一可能的解决方案是,在代码中查看请求域,然后为该域动态发出 ACAO。 【参考方案1】:

我想出了自己的解决方案,它也适用于 Google+ 或 Facebook auth。这是基于iFrame auth的另一个SO问题

您可以使用 iFrame 作为中间件。在 iFrame 中,我向同一来源/域上的应用程序发出请求。

例如:

我的应用程序来自 www.domainA.com,另一个来自 www.domainB.com,它们都包含来自 www.hostingdomain.com 的 iFrame。

从 www.hostingdomain.com 我确实调用了我的 web 服务并设置了一个基于 .NET FormsAuthentication 的 cookie。对于 IE,您必须使用 P3P 来设置 3rd party cookie。

【讨论】:

【参考方案2】:

您可以使用 IIS CORS 模块:https://www.iis.net/downloads/microsoft/iis-cors-module

您的 web.config 应该是这样的,替换您的域的 [origin_#]:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <cors enabled="true" failUnlistedOrigins="true">
            <add origin="[origin_1]">
                <allowMethods>                    
                    <add method="GET" />
                    <add method="HEAD" />
                    <add method="POST" />
                    <add method="PUT" /> 
                    <add method="DELETE" /> 
                </allowMethods>
            </add>
            <add origin="[origin_2]">
                <allowMethods>
                    <add method="GET" />
                    <add method="HEAD" />
                    <add method="POST" />
                    <add method="PUT" /> 
                    <add method="DELETE" /> 
                </allowMethods>
            </add>
        </cors>
    </system.webServer>
</configuration>

您可以在这里找到配置参考:https://docs.microsoft.com/en-us/iis/extensions/cors-module/cors-module-configuration-reference

【讨论】:

以上是关于如何通过在 IIS 8 中使用“Access-Control-Allow-Origin”来允许多个域的主要内容,如果未能解决你的问题,请参考以下文章

如何在 IIS 8 中远程停止/启动应用程序池

如何在不同域中的远程服务器上启动或停止IIS-8.5网站

在 Windows 8 的 IIS 8 上使用 .NET 4.5 的 MVC 4 网站给出 403.14 禁止错误 [关闭]

如何在 IIS 8.x 或更高版本上允许本地和远程的 POST、PUT

如何通过 C# 从 IIS 获取网站名称的端口?

win7系统如何使用IIS发布网站