2015-11-02 61 views
3

我們目前正在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

我也試着不使用靜態屬性來保持政策的上傳和下載,但還是同樣的問題。

回答

0

知道這是一箇舊的,但我們最近遇到了這個問題,並設法修復它。該問題是由異步方法中創建的死鎖造成的。

最後,在這裏提出的建議組合https://stackoverflow.com/a/32429753/3391469和這裏https://stackoverflow.com/a/27581462/3391469做了竅門。

blockBlob.DownloadToStream(stream, null, Task.Run(() => GetOptions()).Result); 

private async static Task<BlobRequestOptions> GetOptions() 
    { 
     var cloudResolver = new KeyVaultKeyResolver(GetToken); 
     var rsa = await cloudResolver.ResolveKeyAsync(Config.Get("AzureKeyVault"), CancellationToken.None).ConfigureAwait(false); 

     var policy = new BlobEncryptionPolicy(rsa, null); 
     return new BlobRequestOptions() { EncryptionPolicy = policy }; 
    } 
+0

如果我們回到舊的方式(好的而不是我們所做的習慣),我會試試這個。 – brakok