使用ASP.NET删除web.config中定义的Access-Control-Allow-Origin

时间:2016-01-08 07:20:42

标签: asp.net

我们在web.config中有一个定义,为所有请求设置一个预定义服务器的Access-Control-Allow-Origin标头。像这样:

<customHeaders>
    <add name="Access-Control-Allow-Origin"value="http://constantServer.com" />
    <add name="Accept-Bytes" value="none" />
</customHeaders>

在某些情况下,我们需要允许访问不同的服务器到特定的资源。我们检查原点并按代码设置Access-Control-Allow-Origin,如下所示:

Response.AddHeader("Access-Control-Allow-Origin", origin);
Response.AddHeader("Access-Control-Allow-Credentials", "true");

问题是浏览器为Access-Control获取了多个值,而不允许它。

我们希望在代码中删除web.config中定义的标头,以防我们需要将其用于不同的来源。

我试图在Application_PreSendRequestHeaders事件中的global.asax中删除它,但我没有在那里找到这个标题。(看来这个标题是在这个事件之后添加的)

由于

1 个答案:

答案 0 :(得分:1)

有关如何更改标头值的IHttpModule解决方案的详细信息,请参阅此answer。它是关于IIS添加的Server默认标头,我认为这是更难处理的情况。

question在其答案中提供了许多其他选项,包括安装和使用URL Rewritedirect link to corresponding answer)。

您可以通过示例将代码更改为仅添加Access-Control-Allow-Credentials,然后编写网址重写规则,以便将Access-Control-Allow-Origin更改为origin

<system.webServer>
    ...
    <rewrite>
        <outboundRules>
            <rule name="handleCredentialCors" preCondition="credential">
                <match serverVariable="Access-Control-Allow-Origin" pattern=".*" />
                <action type="Rewrite" value="origin" />
            </rule>
            <preConditions>
                <preCondition name="credential">
                    <add input="{RESPONSE_Access_Control_Allow_Credentials}" pattern="true" />
                </preCondition>
            </preConditions>
        </outboundRules>
    </rewrite>
    ...
</system.webServer>

(未测试的)

我的不好,我忽略了origin是一个局部变量,而不是文字字符串。

好吧,如果您可以从服务器变量(在U​​RL重写中包含请求标头)中推断origin值,则URL重写仍可以完成工作。它能够提取值,然后在重写的值中重用它们。但是这条规则写起来可能有点复杂。