Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IIS使用Windows Azure存储加密随机挂起_C#_Asp.net Mvc 4_Azure_Iis_Encryption - Fatal编程技术网

C# IIS使用Windows 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

我们目前正在ASP NET MVC 4(C#)和Angularjs中开发一个web应用程序,其中生成的内容被加密并保存在Windows Azure上

有时,IIS会随机挂起请求,而它们仍处于ExecuteRequestHandler阶段。一旦发生这种情况,所有后续请求都将挂起,并且在IIS日志中找不到任何错误

我们使用Microsoft.WindowsAzure SDK处理Windows Azure中的所有内容,并在下载/上载操作期间使用向blob提供的加密策略(EncryptionPolicy属性)对所有blob进行加密。我们还将加密密钥保存在Microsoft 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;
        }
其中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 };
    }