Asp.net

具有多個域的訪問控制允許來源

  • June 26, 2013

access-control-allow-origin在我的 web.config 中,我想為指令指定多個域。我不想使用*. 我試過這種語法:

<add name="Access-Control-Allow-Origin" value="http://localhost:1506, http://localhost:1502" />

這個

<add name="Access-Control-Allow-Origin" value="http://localhost:1506 http://localhost:1502" />

這個

<add name="Access-Control-Allow-Origin" value="http://localhost:1506; http://localhost:1502" />

和這個

<add name="Access-Control-Allow-Origin" value="http://localhost:1506" />
<add name="Access-Control-Allow-Origin" value="http://localhost:1502" />

但它們都不起作用。什麼是正確的語法?

只能有一個Access-Control-Allow-Origin響應標頭,並且該標頭只能有一個原始值。因此,為了讓它工作,你需要一些程式碼:

  1. 獲取Origin請求標頭。
  2. 檢查原始值是否是列入白名單的值之一。
  3. 如果有效,則Access-Control-Allow-Origin使用該值設置標頭。

我認為沒有任何方法可以僅通過 web.config 執行此操作。

if (ValidateRequest()) {
   Response.Headers.Remove("Access-Control-Allow-Origin");
   Response.AddHeader("Access-Control-Allow-Origin", Request.UrlReferrer.GetLeftPart(UriPartial.Authority));

   Response.Headers.Remove("Access-Control-Allow-Credentials");
   Response.AddHeader("Access-Control-Allow-Credentials", "true");

   Response.Headers.Remove("Access-Control-Allow-Methods");
   Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
}

對於 IIS 7.5+ 和 Rewrite 2.0,您可以使用:

<system.webServer>
  <httpProtocol>
    <customHeaders>
        <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
        <add name="Access-Control-Allow-Methods" value="POST,GET,OPTIONS,PUT,DELETE" />
    </customHeaders>
  </httpProtocol>
       <rewrite>            
           <outboundRules>
               <clear />                
               <rule name="AddCrossDomainHeader">
                   <match serverVariable="RESPONSE_Access_Control_Allow_Origin" pattern=".*" />
                   <conditions logicalGrouping="MatchAll" trackAllCaptures="true">
                       <add input="{HTTP_ORIGIN}" pattern="(http(s)?://((.+\.)?domain1\.com|(.+\.)?domain2\.com|(.+\.)?domain3\.com))" />
                   </conditions>
                   <action type="Rewrite" value="{C:0}" />
               </rule>           
           </outboundRules>
       </rewrite>
</system.webServer>

解釋伺服器變數**RESPONSE_Access_Control_Allow_Origin**部分:

在 Rewrite 中,您可以在之後使用任何字元串RESPONSE_,它將使用單詞的其餘部分作為標題名稱(在本例中為 Access-Control-Allow-Origin)創建響應標題。重寫使用下劃線“_”而不是破折號“-”(重寫將它們轉換為破折號)

解釋伺服器變數**HTTP_ORIGIN**:

類似地,在 Rewrite 中,您可以使用任何請求標頭HTTP_作為前綴。破折號的規則相同(使用下劃線“_”而不是破折號“-”)。

引用自:https://stackoverflow.com/questions/17323350