How do i add a CORS rule to the Azure Storage Emulator with HTTP?
Asked Answered
G

3

13

To use the Azure Storage (Emulator) Table Service, i need to add a CORS rule for my TypeScript Browser App.

I want to add that rule manually using the REST interface (from Postman, not the Browser with the Same Origin Policy). The documentation does not give the correct URL for the Emulator (https://learn.microsoft.com/en-us/rest/api/storageservices/fileservices/set-table-service-properties). For DML commands it is like in my request (https://learn.microsoft.com/en-us/rest/api/storageservices/fileservices/insert-entity).

The request is:

PUT /devstoreaccount1/?restype=service&comp=properties HTTP/1.1
Host: 127.0.0.1:10002
x-ms-version: 2013-08-15
Content-Type: application/xml
Cache-Control: no-cache
Postman-Token: 280f880b-d6df-bb1d-bc12-eca411e18310

<StorageServiceProperties>
    <Cors>
        <CorsRule>
            <AllowedOrigins>http://localhost:3030</AllowedOrigins>
            <AllowedMethods>GET,PUT,POST</AllowedMethods>
            <MaxAgeInSeconds>500</MaxAgeInSeconds>
            <ExposedHeaders>x-ms-meta-data*,x-ms-meta-target*,x-ms-meta-abc</ExposedHeaders>
            <AllowedHeaders>x-ms-meta-*</AllowedHeaders>
        </CorsRule>
    </Cors>
</StorageServiceProperties>

The result is:

<?xml version="1.0" encoding="utf-8"?>
<m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
    <m:code>ResourceNotFound</m:code>
    <m:message xml:lang="en-US">The specified resource does not exist.
RequestId:8137042f-0402-46c6-aa8c-fbf9f4601d33
Time:2017-01-15T09:13:51.7500394Z</m:message>
</m:error>

What is the correct URL or what am i doing wrong?

Glossographer answered 15/1, 2017 at 9:46 Comment(0)
F
13

If you download the Microsoft Azure Storage Explorer, you can set it up by right clicking on "Blob Containers" under your account.

enter image description here

Fertilizer answered 9/10, 2018 at 21:18 Comment(0)
G
10

Here is a Powershell script to add a CORS rule to the Azure Storage Emulator. It is not the answer to this question but a solution for my problem:

$ErrorActionPreference = "Stop";

# config

$AccountName='devstoreaccount1'
$AccountKey='Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw=='

# derived config

$BlobEndpoint="http://127.0.0.1:10000/$($AccountName)"
$QueueEndpoint="http://127.0.0.1:10001/$($AccountName)"
$TableEndpoint="http://127.0.0.1:10002/$($AccountName)"

$ConnectionString = "" +
    "DefaultEndpointsProtocol=http;" + 
    "BlobEndpoint=$($BlobEndpoint);" +
    "QueueEndpoint=$($QueueEndpoint);" +
    "TableEndpoint=$($TableEndpoint);" +
    "AccountName=$($AccountName);" +
    "AccountKey=$($AccountKey)"

# authentication

$Context = New-AzureStorageContext `
    -ConnectionString $ConnectionString

# cors rules
$CorsRules = (@{
    AllowedHeaders=@("*");
    AllowedOrigins=@("*");
    ExposedHeaders=@("Content-Length");
    MaxAgeInSeconds=60*60*24;
    AllowedMethods=@("Get", "Post")
})

Set-AzureStorageCORSRule `
    -ServiceType Table `
    -Context $Context `
    -CorsRules $CorsRules

# check
Get-AzureStorageCORSRule `
    -ServiceType Table `
    -Context $Context
Glossographer answered 15/1, 2017 at 14:12 Comment(0)
I
0

I've adjusted @abbgrade post to work with the latest Powershell (tested with 7.1.3). Thanks abbgrade for you're helpful input. I was trying to get it to work with the az cli, but that worked finally!

Install-Module Az.Storage

$AccountName='devstoreaccount1'
$AccountKey='Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw=='
$BlobEndpoint="http://127.0.0.1:10000/$($AccountName)"
$QueueEndpoint="http://127.0.0.1:10001/$($AccountName)"
$TableEndpoint="http://127.0.0.1:10002/$($AccountName)"

$ConnectionString = "" +
    "DefaultEndpointsProtocol=http;" + 
    "BlobEndpoint=$($BlobEndpoint);" +
    "QueueEndpoint=$($QueueEndpoint);" +
    "TableEndpoint=$($TableEndpoint);" +
    "AccountName=$($AccountName);" +
    "AccountKey=$($AccountKey)"

$Context = New-AzStorageContext ` -ConnectionString $ConnectionString

$CorsRules = (@{
    AllowedHeaders=@("*");
    AllowedOrigins=@("*");
    ExposedHeaders=@("*");
    MaxAgeInSeconds=60*60*24;
    AllowedMethods=@("Get", "Post", "Put", "Delete", "Head", "Options")
})

Set-AzStorageCORSRule `
    -ServiceType Blob `
    -Context $Context `
    -CorsRules $CorsRules

Set-AzStorageCORSRule `
    -ServiceType Queue `
    -Context $Context `
    -CorsRules $CorsRules

Set-AzStorageCORSRule `
    -ServiceType Table `
    -Context $Context `
    -CorsRules $CorsRules

Write-Host "CORS for Blob:"
Get-AzStorageCORSRule `
    -ServiceType Blob `
    -Context $Context

Write-Host "CORS for Queue:"
Get-AzStorageCORSRule `
    -ServiceType Queue `
    -Context $Context

Write-Host "CORS for Table:"
Get-AzStorageCORSRule `
    -ServiceType Table `
    -Context $Context

Write-Host "CORS rules for Azurite have been configured."
Internationale answered 31/5, 2023 at 6:20 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.