我們目前正在ASP NET MVC 4(C#)和Angularjs中開發一個Web應用程序,其中我們生成的內容被加密並保存在Windows Azure上。IIS隨機與Windows Azure存儲加密掛起
有時,隨機地,IIS在請求上掛起並且它們仍然處於ExecuteRequestHandler階段。發生這種情況後,所有後續請求都會掛起,並且在我們的IIS日誌中找不到任何錯誤。
我們使用Microsoft.WindowsAzure SDK處理Windows Azure的所有內容,並在下載/上載操作(EncryptionPolicy屬性)期間使用爲blob提供的加密策略加密所有Blob。我們還將加密密鑰保存在Windows Azure的密鑰庫中。
下面就來獲取我們的政策代碼:
public async static Task<string> GetToken(string authority, string resource, string scope)
{
var authContext = new AuthenticationContext(authority);
var credentials = new ClientCredential(AzureSection.ClientId, AzureSection.ClientSecret);
var result = await authContext.AcquireTokenAsync(resource, credentials);
if(result == null)
throw new InvalidOperationException("Error when obtaining KeyVault token");
return result.AccessToken;
}
public static BlobEncryptionPolicy GetUploadPolicy()
{
if (_policyUpload == null && !IsDebug)
{
var resolver = new KeyVaultKeyResolver(KeyVaultHelper.GetToken);
var key = resolver.ResolveKeyAsync(AzureSection.ResourceGroup.KeyVault.Url, CancellationToken.None).GetAwaiter().GetResult();
_policyUpload = new BlobEncryptionPolicy(key, null);
}
return _policyUpload;
}
public static BlobEncryptionPolicy GetDownloadPolicy()
{
if (_policyDownload == null && !IsDebug)
{
var resolver = new KeyVaultKeyResolver(KeyVaultHelper.GetToken);
_policyDownload = new BlobEncryptionPolicy(null, resolver);
}
return _policyDownload;
}
我們又如何下載/上傳操作過程中使用它:
_policyDownload = PolicyHelper.GetDownloadPolicy();
public Task DownloadToStreamAsync(Stream output)
{
return !BaseBlob.Exists() ? null
: BaseBlob.DownloadToStreamAsync(output, null, new BlobRequestOptions{
DisableContentMD5Validation = true,
EncryptionPolicy = _policyDownload
}, null);
}
凡BaseBlob是Microsoft.WindowsAzure.Storage.Blob。 CloudBlockBlob和AzureSection是web.config中的一部分。
我們的服務器是在Windows Server 2008 R2上運行的IIS 7.5。 我們在Windows Server 2012和IIS 8上嘗試過,但同樣的問題。
當我們從Blob操作中刪除EncryptionPolicy時,所有工作都很好。
有沒有人知道爲什麼會發生這種情況,因爲我找不到任何東西(因爲最近已經實施了天藍色的加密,並且掛起的請求沒有提供任何錯誤)?
編輯
我試圖用這個代替檢索我們的加密策略(如在https://azure.microsoft.com/en-us/documentation/articles/storage-encrypt-decrypt-blobs-key-vault/意見建議):
using Microsoft.Azure.KeyVault.WebKey;
var kv = new KeyVaultClient(Utils.GetToken);
var key = kv.GetKeyAsync("https://contosokeyvault.vault....").Result;
var rsa = new RsaKey(key.KeyIdentifier.Identifier, key.Key.ToRSA());
但還是同樣的問題。
EDIT 2
我也試着不使用靜態屬性來保持政策的上傳和下載,但還是同樣的問題。
如果我們回到舊的方式(好的而不是我們所做的習慣),我會試試這個。 – brakok