-
-
Save codingoutloud/372b303ebb19d38da38a to your computer and use it in GitHub Desktop.
Blob CORS Toggler
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@echo off | |
D:\dev\path\to\ToggleCors.exe azuremap 123abcYourStorageKeyIsHere987zyx== %1 | |
echo. | |
echo FOR COMPARISON QUERY THE nocors SERVICE (which never has CORS set) | |
echo. | |
D:\dev\path\to\ToggleCors.exe nocors 123abcYourStorageKeyIsHere987zyx== -q | |
echo. | |
PowerShell -Command Get-Date |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using Microsoft.WindowsAzure.Storage.Auth; | |
using Microsoft.WindowsAzure.Storage.Blob; | |
using Microsoft.WindowsAzure.Storage.Shared.Protocol; | |
using Newtonsoft.Json; | |
namespace BlobCorsToggle | |
{ | |
public class SimpleAzureBlobCorsSetter | |
{ | |
public CloudBlobClient CloudBlobClient { get; private set; } | |
public SimpleAzureBlobCorsSetter(Uri blobServiceUri, StorageCredentials storageCredentials) | |
{ | |
this.CloudBlobClient = new CloudBlobClient(blobServiceUri, storageCredentials); | |
} | |
public SimpleAzureBlobCorsSetter(CloudBlobClient blobClient) | |
{ | |
this.CloudBlobClient = blobClient; | |
} | |
/// <summary> | |
/// Set Blob Service CORS settings for specified Windows Azure Storage Account. | |
/// Either sets to a hard-coded set of values (see below) or clears of all CORS settings. | |
/// | |
/// Does not check for any existing CORS settings, but clobbers with the CORS settings | |
/// to allow HTTP GET access from any origin. Non-CORS settings are left intact. | |
/// | |
/// Most useful for scenarios where a file is published in Blob Storage for read-access | |
/// by any client. | |
/// | |
/// Can also be useful in conjunction with Valet Key Pattern-style limited access, as | |
/// might be useful with a mobile application. | |
/// </summary> | |
/// <param name="clear">if true, clears all CORS setting, else allows GET from any origin</param> | |
public void SetBlobCorsGetAnyOrigin(bool clear) | |
{ | |
// http://msdn.microsoft.com/en-us/library/windowsazure/dn535601.aspx | |
var corsGetAnyOriginRule = new CorsRule(); | |
corsGetAnyOriginRule.AllowedOrigins.Add("*"); // allow access to any client | |
corsGetAnyOriginRule.AllowedMethods = CorsHttpMethods.Get; // only CORS-enable http GET | |
corsGetAnyOriginRule.ExposedHeaders.Add("*"); // let client see any header we've configured | |
corsGetAnyOriginRule.AllowedHeaders.Add("*"); // let clients request any header they can think of | |
corsGetAnyOriginRule.MaxAgeInSeconds = (int)TimeSpan.FromHours(10).TotalSeconds; // clients are safe to cache CORS config for up to this long | |
var blobServiceProperties = this.CloudBlobClient.GetServiceProperties(); | |
if (clear) | |
{ | |
blobServiceProperties.Cors.CorsRules.Clear(); | |
} | |
else | |
{ | |
blobServiceProperties.Cors.CorsRules.Clear(); // replace current property set | |
blobServiceProperties.Cors.CorsRules.Add(corsGetAnyOriginRule); | |
} | |
this.CloudBlobClient.SetServiceProperties(blobServiceProperties); | |
} | |
public void DumpCurrentProperties() | |
{ | |
var blobServiceProperties = this.CloudBlobClient.GetServiceProperties(); | |
var blobPropertiesStringified = StringifyProperties(blobServiceProperties); | |
Console.WriteLine("Current Properties:\n{0}", blobPropertiesStringified); | |
} | |
internal string StringifyProperties(ServiceProperties serviceProperties) | |
{ | |
// JsonConvert.SerializeObject(serviceProperties) for whole object graph or | |
// JsonConvert.SerializeObject(serviceProperties.Cors) for just CORS | |
return Newtonsoft.Json.JsonConvert.SerializeObject(serviceProperties, Formatting.Indented); | |
} | |
} | |
} | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Diagnostics; | |
using System.IO; | |
using Microsoft.WindowsAzure.Storage.Auth; | |
namespace BlobCorsToggle | |
{ | |
class Program | |
{ | |
static string clearFlag = "-clear"; | |
static string queryFlag = "-q"; | |
static void Main(string[] args) | |
{ | |
if (args.Length == 0 || !ValidCommandArguments(args)) | |
{ | |
#region Show Correct Usage | |
if (args.Length != 0 && !ValidCommandArguments(args)) | |
{ | |
var saveForegroundColor = Console.ForegroundColor; | |
Console.ForegroundColor = ConsoleColor.Red; | |
Console.Write("\nINVALID COMMAND LINE OR UNKNOWN FLAGS: "); | |
foreach (var arg in args) Console.Write("{0} ", arg); | |
Console.WriteLine(); | |
Console.ForegroundColor = saveForegroundColor; | |
} | |
Console.WriteLine("usage:\n{0} <storage acct name> <storage acct key> [{1}]", | |
Path.GetFileNameWithoutExtension(Environment.GetCommandLineArgs()[0]), | |
clearFlag); | |
Console.WriteLine(); | |
Console.WriteLine("example setting:\n{0} {1} {2}", | |
Path.GetFileNameWithoutExtension(Environment.GetCommandLineArgs()[0]), | |
"mystorageacct", | |
"lala+aou812SomERAndOmStrINglOlLolFroMmYStORaG3akounT314159265358979323ilIkEpi=="); | |
Console.WriteLine(); | |
Console.WriteLine("example clearing:\n{0} {1} {2} {3}", | |
Path.GetFileNameWithoutExtension(Environment.GetCommandLineArgs()[0]), | |
"mystorageacct", | |
"lala+aou812SomERAndOmStrINglOlLolFroMmYStORaG3akounT314159265358979323ilIkEpi==", | |
clearFlag); | |
if (Debugger.IsAttached) | |
{ | |
Console.WriteLine("\nPress any key to exit."); | |
Console.ReadKey(); | |
} | |
#endregion | |
} | |
else | |
{ | |
var storageAccountName = args[0]; | |
var storageKey = args[1]; | |
var blobServiceUri = new Uri(String.Format("https://{0}.blob.core.windows.net", storageAccountName)); | |
var storageCredentials = new StorageCredentials(storageAccountName, storageKey); | |
var blobConfig = new SimpleAzureBlobCorsSetter(blobServiceUri, storageCredentials); | |
bool query = (args.Length == 3 && args[2] == queryFlag); | |
if (query) | |
{ | |
blobConfig.DumpCurrentProperties(); | |
return; | |
} | |
blobConfig.DumpCurrentProperties(); | |
Console.WriteLine(); | |
bool clear = (args.Length == 3 && args[2] == clearFlag); | |
blobConfig.SetBlobCorsGetAnyOrigin(clear); | |
Console.WriteLine("CORS Blob Properties for Storage Account {0} have been {1}.", | |
storageAccountName, clear ? "cleared" : "set"); | |
Console.WriteLine(); | |
blobConfig.DumpCurrentProperties(); | |
} | |
} | |
private static bool ValidCommandArguments(string[] args) | |
{ | |
if (args.Length == 2) return true; | |
if (args.Length == 3 && (args[2] == clearFlag || args[2] == queryFlag)) return true; | |
return false; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment