[英]Set CORS on Windows Azure blob storage using ASP.NET
我正在嘗試在我的Windows Azure blob存儲帳戶上設置CORS屬性。 我正在使用ASP.NET服務器發送PUT請求。
服務器正在發回Forbidden響應,說“ 服務器無法驗證請求。請確保正確形成Authorization標頭的值,包括簽名。 ”
所以它必須是我的身份驗證標題中的內容。 以下是我用來獲取標題的兩個函數。
public string GetWindowsAzureAuthenticationHeader(string verb)
{
string stringToSign = String.Format("{0}\n"
+ "\n" // content encoding
+ "\n" // content language
+ "\n" // content length
+ "\n" // content md5
+ "\n" // content type
+ "\n" // date
+ "\n" // if modified since
+ "\n" // if match
+ "\n" // if none match
+ "\n" // if unmodified since
+ "\n" // range
+ "x-ms-date:" + DateTime.UtcNow.ToString("R") + "\nx-ms-version:2013-08-15\n" // headers
+ "/{1}\ncomp:properties\nrestype:service", verb, CloudConfig.StorageAccountName);
return SignThis(stringToSign, CloudConfig.StorageAccountKey, CloudConfig.StorageAccountName);
}
private string SignThis(string stringToSign, string key, string account)
{
string signature;
var unicodeKey = Convert.FromBase64String(key);
using (var hmacSha256 = new HMACSHA256(unicodeKey))
{
var dataToHmac = Encoding.UTF8.GetBytes(stringToSign);
signature = Convert.ToBase64String(hmacSha256.ComputeHash(dataToHmac));
}
String authorizationHeader = String.Format(
CultureInfo.InvariantCulture,
"{0} {1}:{2}",
"SharedKey",
account,
signature);
return authorizationHeader;
}
這是發送請求的控制器操作。 _mediaFactory.GetWindowsAzureCors方法使用我的CORS請求返回XML文件的內容。
var content = Encoding.UTF8.GetBytes(_mediaFactory.GetWindowsAzureCors(ControllerContext.HttpContext.Server));
var request = (HttpWebRequest)WebRequest.Create(CloudConfig.StorageAccountUri);
request.Method = "PUT";
request.Headers.Add("x-ms-date", DateTime.UtcNow.ToString("R"));
request.Headers.Add("x-ms-version", "2013-08-15");
request.ContentType = "text/plain; charset=UTF-8";
request.Host = string.Format("{0}.blob.core.windows.net", CloudConfig.StorageAccountName);
request.Headers.Add("Authorization", _mediaFactory.GetWindowsAzureAuthenticationHeader(request.Method));
request.GetRequestStream().Write(content, 0, content.Length);
using (var response = (HttpWebResponse) request.GetResponse())
{
model.StatusCode = response.StatusCode;
model.Response = response.StatusDescription;
}
我究竟做錯了什么?
它實際上非常簡單。
首先,在項目中添加對Azure Storage Client庫的引用。 如果您正在使用Nuget,您要安裝的軟件包是WindowsAzure.Storage
。
之后,設置CORS設置的功能是SetServiceProperties
。 以下是執行此操作的示例代碼:
CloudStorageAccount storageAccount = new CloudStorageAccount(new Microsoft.WindowsAzure.Storage.Auth.StorageCredentials(accountName, accountKey), true);
var blobClient = storageAccount.CreateCloudBlobClient();
ServiceProperties blobServiceProperties = new ServiceProperties();
blobServiceProperties.Cors.CorsRules.Add(new CorsRule(){
AllowedHeaders = new List<string>() {"*"},
ExposedHeaders = new List<string>() {"*"},
AllowedMethods = CorsHttpMethods.Post | CorsHttpMethods.Put | ... Other Allowed Methods,
AllowedOrigins = new List<string>() {"http://yourdomain.com", "https://yourdomain.com", "blah", "blah", "blah"},
MaxAgeInSeconds = 3600,
});
blobClient.SetServiceProperties(blobServiceProperties);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.