匯出 (0) 列印
全部展開

跨原始資源共用 (CORS) 支援 Windows Azure 儲存體服務

更新日期: 2014年11月

從 2013-08-15 版開始,Windows Azure 儲存體服務支援 Blob、資料表和佇列服務的「跨原始資源共用」(CORS)。CORS 是 HTTP 功能,可讓在某個網域下執行的 Web 應用程式存取另一個網域中的資源。網頁瀏覽器實作稱為相同原始原則的安全性限制,該限制防止網頁呼叫不同網域的 API;CORS 提供安全的方法,讓某個網域 (原始網域) 可以安全地呼叫另一個網域的 API。如需 CORS 的詳細資訊,請參閱 CORS 規格

您可以呼叫 設定 Blob 服務屬性 (REST 應用程式開發介面)設定佇列服務屬性 (REST 應用程式開發介面)設定表格服務屬性 (REST 應用程式開發介面),為每項儲存體服務個別設定 CORS 規則。在您設定服務的 CORS 規則之後,系統會評估來自其他網域針對服務所提出且經適當驗證的要求,以根據您指定的規則來決定是否允許該要求。

note附註
請注意,CORS 不是驗證機制。啟用 CORS 時,對儲存資源提出的所有要求必須具有適當的驗證簽章,或必須是對公開資源提出的要求。

來自原始網域的 CORS 要求可能包含兩個不同要求:

  • 查詢服務所加諸之 CORS 限制的預檢要求。除非要求方法為簡單方法 (亦即 GET、HEAD 或 POST),否則需要預檢要求。

  • 對所需資源提出的實際要求。

預檢要求會查詢帳戶擁有者為儲存體服務所建立的 CORS 限制。網頁瀏覽器 (或其他使用者代理程式) 會傳送包含要求標頭、方法和原始網域的 OPTIONS 要求。儲存體服務會根據預先設定的 CORS 規則集來評估預定作業,該規則集指定可在對儲存資源所提出的實際要求上指定的原始網域、要求方法和要求標頭。

如果啟用服務的 CORS,且 CORS 規則符合預檢要求,服務會以狀態碼 200 (確定) 回應,並在回應中包含所需的 Access-Control 標頭。

如果未啟用服務的 CORS 或 CORS 規則不符合預檢要求,服務會以狀態碼 403 (禁止) 回應。

如果 OPTIONS 要求不包含所需的 CORS 標頭 (Origin 和 Access-Control-Request-Method 標頭),服務會以狀態碼 400 (不正確的要求) 回應。

請注意,預檢要求會根據服務 (Blob、佇列和資料表) 進行評估,而不是根據所要求的資源進行評估。帳戶擁有者必須啟用 CORS 做為帳戶服務屬性的一部分,要求才能成功。

接受預檢要求並傳回回應之後,瀏覽器會對儲存資源發送實際要求。如果預檢要求遭到拒絕,則瀏覽器會立即拒絕實際要求。

實際要求會當對儲存體服務提出的一般要求來處理。Origin 標頭表示要求是 CORS 要求,且服務會檢查 CORS 比對規則。
如果找到相符項,則會將 Access-Control 標頭加入至回應並傳回給用戶端。如果找不到相符項,則不會傳回 CORS Access-Control 標頭。

CORS 規則會在服務層級設定,因此您必須為每項服務 (Blob、資料表和佇列) 個別啟用或停用 CORS。預設會停用每項服務的 CORS。若要啟用 CORS,您必須使用 2013-08-15 或更新版本設定適當的服務屬性,並將 CORS 規則加入至服務屬性。如需如何啟用或停用服務的 CORS,以及如何設定 CORS 規則的詳細資訊,請參閱<設定 Blob 服務屬性 (REST 應用程式開發介面)>、<設定表格服務屬性 (REST 應用程式開發介面)>及<設定佇列服務屬性 (REST 應用程式開發介面)>。

以下是透過「設定服務屬性」作業指定的單一 CORS 規則範例:

<Cors>    
      <CorsRule>
            <AllowedOrigins>http://www.contoso.com, http://www.fabrikam.com</AllowedOrigins>
            <AllowedMethods>PUT,GET</AllowedMethods>
            <AllowedHeaders>x-ms-meta-data*,x-ms-meta-target*,x-ms-meta-abc</AllowedHeaders>
            <ExposedHeaders>x-ms-meta-*</ExposedHeaders>
            <MaxAgeInSeconds>200</MaxAgeInSeconds>
    </CorsRule>
<Cors>

以下說明 CORS 規則中所包含的每個元素:

  • AllowedOrigins:獲允許透過 CORS 對儲存體服務提出要求的原始網域。原始網域是要求源自的網域。請注意,原始網域的大小寫必須與使用者代理程式傳送至服務之原始網域的大小寫相符。您也可以使用萬用字元 '*' 允許所有原始網域透過 CORS 提出要求。在上述範例中,http://www.contoso.com 和 http://www.fabrikam.com 網域可透過 CORS 對服務提出要求。

  • AllowedMethods:原始網域可用於 CORS 要求的方法 (HTTP 要求動詞命令)。在上述範例中,僅允許 PUT 和 GET 要求。

  • AllowedHeaders:原始網域可在 CORS 要求上指定的要求標頭。在上述範例中,允許開頭為 x-ms-meta-datax-ms-meta-targetx-ms-meta-abc 的所有中繼資料標頭。請注意,萬用字元 '*' 表示允許開頭為指定前置詞的所有標頭。

  • ExposedHeaders:可在對 CORS 要求的回應中傳送並由瀏覽器向發出要求的人員公開的回應標頭。在上述範例中,系統會指示瀏覽器公開開頭為 x-ms-meta 的所有標頭。

  • MaxAgeInSeconds:瀏覽器應該快取預檢 OPTIONS 要求的時間長度上限。

Windows Azure 儲存體服務支援為 AllowedHeadersExposedHeaders 元素指定帶有前置詞的標頭。若要允許某個標頭類別,您可以為該類別指定通用的前置詞。例如,指定 x-ms-meta* 做為帶有前置詞的標頭,以建立比對開頭為 x-ms-meta 之所有標頭的規則。

下列限制適用於 CORS 規則:

  • 每項儲存體服務 (Blob、資料表和佇列) 最多可以指定五項 CORS 規則。

  • 要求上的所有 CORS 規則設定,排除 XML 標記後的大小上限不得超過 2 KB。

  • 允許的標頭、公開的標頭或允許的原始網域,其長度均不得超過 256 個字元。

  • 允許的標頭和公開的標頭可以是:

    • 常值標頭,即在其中提供確切標頭名稱,例如 x-ms-meta-processed。要求上最多可指定 64 個常值標頭。

    • 帶有前置詞的標頭,即在其中提供標頭的前置詞,例如 x-ms-meta-data*。藉此方式指定前置詞,便能允許或公開以給定前置詞開頭的任何標頭。要求上最多可指定兩個帶有前置詞的標頭。

  • AllowedMethods 元素中指定的方法 (或 HTTP 動詞命令) 必須符合 Windows Azure 儲存體服務 API 支援的方法。支援的方法包括 DELETE、GET、HEAD、MERGE、POST、OPTIONS 和 PUT。

當儲存體服務收到預檢或實際要求時,會根據您透過適當的「設定服務屬性」作業為服務建立的 CORS 規則來評估該要求。CORS 規則會依照其在「設定服務屬性」作業之要求主體中設定的順序進行評估。

CORS 規則的評估方式如下:

  1. 首先會根據 AllowedOrigins 元素列出的網域來檢查要求的原始網域。如果清單中包含原始網域,或使用萬用字元 '*' 允許所有網域,則會繼續評估規則。如果不包含原始網域,則要求失敗。

  2. 接著會根據 AllowedMethods 元素列出的方法來檢查要求的方法 (或 HTTP 動詞命令)。如果清單中包含此方法,則會繼續評估規則,否則要求就會失敗。

  3. 如果要求在原始網域和方法方面符合某項規則,則會選取該規則來處理要求,且不會評估其他任何規則。不過,系統會根據 AllowedHeaders 元素列出的標頭來檢查在要求上指定的所有標頭,在這之後,要求才會成功。如果傳送的標頭不符合允許的標頭,則要求失敗。

由於規則的處理順序是依照其在要求主體中出現的順序,最佳作法建議您將與原始網域相關的最嚴格規則指定在清單前端,以便先評估這些規則。然後將較不嚴格的規則 (例如允許所有原始網域的規則) 指定在清單結尾。

下列範例顯示作業的部分要求主體,該主體用於設定儲存體服務的 CORS 規則。如需建構要求的詳細資訊,請參閱<設定 Blob 服務屬性 (REST 應用程式開發介面)>、<設定佇列服務屬性 (REST 應用程式開發介面)>及<設定表格服務屬性 (REST 應用程式開發介面)>。

<Cors>
    <CorsRule>
        <AllowedOrigins>http://www.contoso.com</AllowedOrigins>
        <AllowedMethods>PUT,HEAD</AllowedMethods>
        <MaxAgeInSeconds>5</MaxAgeInSeconds>
        <ExposedHeaders>x-ms-*</ExposedHeaders>
        <AllowedHeaders>x-ms-blob-content-type, x-ms-blob-content-disposition</AllowedHeaders>
    </CorsRule>
    <CorsRule>
        <AllowedOrigins>*</AllowedOrigins>
        <AllowedMethods>PUT,GET</AllowedMethods>
        <MaxAgeInSeconds>5</MaxAgeInSeconds>
        <ExposedHeaders>x-ms-*</ExposedHeaders>
        <AllowedHeaders>x-ms-blob-content-type, x-ms-blob-content-disposition</AllowedHeaders>
    </CorsRule>
    <CorsRule>
        <AllowedOrigins>http://www.contoso.com</AllowedOrigins>
        <AllowedMethods>GET</AllowedMethods>
        <MaxAgeInSeconds>5</MaxAgeInSeconds>
        <ExposedHeaders>x-ms-*</ExposedHeaders>
        <AllowedHeaders>x-ms-client-request-id</AllowedHeaders>
    </CorsRule>
</Cors>

接下來,請考慮下列 CORS 需求:

 

Request

Response

Method

Origin

Request headers

Rule Match

Result

PUT

http://www.contoso.com

x-ms-blob-content-type

第一項規則

成功

GET

http://www.contoso.com

x-ms-blob-content-type

第二項規則

成功

GET

http://www.contoso.com

x-ms-client-request-id

第二項規則

失敗

第一個要求符合第一項規則 (原始網域符合允許的原始網域、方法符合允許的方法,且標頭符合允許的標頭),因此成功。

第二個要求不符合第一項規則,因為其方法不符合允許的方法。但是,該要求符合第二項規則,因此成功。

第三個要求在原始網域和方法方面符合第二項規則,因此不會評估其他任何規則。但是,第二項規則不允許 x-ms-client-request-id 標頭,因此儘管第三項規則的語意事實上允許要求成功,但要求仍失敗。

note附註
雖然此範例在較嚴格的規則之前顯示較不嚴格的規則,但一般而言,最佳作法會先列出最嚴格的規則。

Vary 標頭是由一組要求標頭欄位所組成的標準 HTTP/1.1 標頭,這些欄位向瀏覽器或使用者代理程式建議相關準則 (伺服器已選取這些準則來處理要求)。Vary 標頭主要提供給 Proxy、瀏覽器及 CDN 用於快取,Proxy、瀏覽器及 CDN 使用此標頭來決定回應的快取方式。如需詳細資訊,請參閱 Vary 標頭的規格。

當瀏覽器或其他使用者代理程式從 CORS 要求快取回應時,會快取原始網域做為允許的原始網域。當第二個網域在啟用快取的情況下對儲存資源發出相同的要求時,使用者代理程式會擷取快取的原始網域。第二個網域不符合快取的網域,因此要求失敗 (如果符合則成功)。在某些情況下,Windows Azure 儲存體會將 Vary 標頭設定為 Origin,以在要求的網域與快取的原始網域不同時,指示使用者代理程式將後續 CORS 要求傳送至服務。

在下列情況下,Windows Azure 儲存體會將實際 GET/HEAD 要求的 Vary 標頭設定為 Origin

  • 要求的原始網域完全符合 CORS 規則所定義之允許的原始網域時。若要完全符合,CORS 規則不可以包含萬用字元 '*'。

  • 沒有比對要求之原始網域的規則,但啟用了儲存體服務的 CORS。

在 GET/HEAD 要求符合允許所有原始網域之 CORS 規則的情況下,回應會指出允許所有原始網域,而使用者代理程式快取會在快取啟用期間,允許來自任何原始網域的後續要求。

請注意,如果要求使用非 GET/HEAD 方法,儲存體服務不會設定 Vary 標頭,因為使用者代理程式不會快取這些方法的回應。

下表指出 Windows Azure 儲存體如何根據前述案例回應 GET/HEAD 要求:

 

要求

帳戶設定和規則評估結果

回應

要求中存在 Origin 標頭

已針對此服務指定 CORS 規則

存在允許所有原始網域的比對規則 (*)

存在原始網域完全相符的比對規則

回應包含設定為 Origin 的 Vary 標頭

回應包含 Access-Control-Allowed-Origin:"*"

回應包含 Access-Control-Exposed-Headers

如果您為帳戶的任何儲存體服務啟用 CORS (透過呼叫 設定 Blob 服務屬性 (REST 應用程式開發介面)設定佇列服務屬性 (REST 應用程式開發介面)設定表格服務屬性 (REST 應用程式開發介面)),成功的預檢要求會計費。若要降低費用,請考慮將 CORS 規則中的 MaxAgeInSeconds 元素設定為大型值,以便使用者代理程式快取要求。

不成功的預檢要求不會計費。

另請參閱

顯示:
© 2014 Microsoft