C# IIS使用Windows Azure存储加密随机挂起
我们目前正在ASP NET MVC 4(C#)和Angularjs中开发一个web应用程序,其中生成的内容被加密并保存在Windows Azure上 有时,IIS会随机挂起请求,而它们仍处于ExecuteRequestHandler阶段。一旦发生这种情况,所有后续请求都将挂起,并且在IIS日志中找不到任何错误 我们使用Microsoft.WindowsAzure SDK处理Windows Azure中的所有内容,并在下载/上载操作期间使用向blob提供的加密策略(EncryptionPolicy属性)对所有blob进行加密。我们还将加密密钥保存在Microsoft Azure上的密钥库中 以下是检索我们的策略的代码:C# IIS使用Windows Azure存储加密随机挂起,c#,asp.net-mvc-4,azure,iis,encryption,C#,Asp.net Mvc 4,Azure,Iis,Encryption,我们目前正在ASP NET MVC 4(C#)和Angularjs中开发一个web应用程序,其中生成的内容被加密并保存在Windows Azure上 有时,IIS会随机挂起请求,而它们仍处于ExecuteRequestHandler阶段。一旦发生这种情况,所有后续请求都将挂起,并且在IIS日志中找不到任何错误 我们使用Microsoft.WindowsAzure SDK处理Windows Azure中的所有内容,并在下载/上载操作期间使用向blob提供的加密策略(EncryptionPolicy
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;
}
其中BaseBlob是Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob,AzureSection是web.config中的一个部分
我们的服务器是运行在Windows server 2008 R2上的IIS 7.5。
我们在Windows Server 2012和IIS 8上进行了尝试,但问题相同
当我们从blob操作中删除EncryptionPolicy时,所有这些都可以正常工作
有没有人知道为什么会发生这种情况,因为我找不到任何东西(因为最近实施了azure加密,挂起的请求没有向我们提供任何错误)
编辑
我尝试使用它来检索我们的加密策略(如的评论中所建议的):
但还是一样的问题
编辑2
我还尝试不使用静态属性来保留上载和下载策略,但仍然存在相同的问题。知道这是一个有点旧的问题,但我们最近遇到了这个问题,并设法解决了它。该问题是由异步方法中创建的死锁引起的 最后,这里和这里提出的建议结合在一起就成功了
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 };
}
blockBlob.DownloadToStream(stream,null,Task.Run(()=>GetOptions()).Result);
私有异步静态任务GetOptions()
{
var cloudResolver=newkeyvaultkeysolver(GetToken);
var rsa=await cloudResolver.ResolveKeyAsync(Config.Get(“AzureKeyVault”),CancellationToken.None);
var policy=new blobenchryptionpolicy(rsa,null);
返回新的BlobRequestOptions(){EncryptionPolicy=policy};
}
如果我们回到以前的方式(好的方式,而不是我们定制的方式),我会试试这个。
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());
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 };
}