私のMVC/Durandal Webアプリケーションを使用してアイデンティティ文書をAzureブロブストレージに保存しています。私はthisの例に従うと、Azure鍵保管庫を使用してAzureストレージ内のブロブを暗号化し、暗号化秘密を保管しています。KeyVaultKeyResolverのAzure rsaKeyは常にnullです。
public async Task UploadIdentityDocumentForClient(string fileName, ParsedClientModel parsedClientModel) { BlobRequestOptions options = await GetBlobRequestOptions(); await _storageRepository.CreateEncryptedBlobFromByteArray(_storageManager, _containerName, fileName, parsedClientModel.IdentityDocumentFile, parsedClientModel.IdentityDocumentContentType, options); return fileName; } private static async Task GetBlobRequestOptions() { string secretUri = WebConfigurationManager.AppSettings["SecretUri"]; string secretName = WebConfigurationManager.AppSettings["SecretEncryptionName"]; *1 KeyVaultKeyResolver keyVaultKeyResolver = new KeyVaultKeyResolver(GetAccessToken); *2 IKey rsaKey = keyVaultKeyResolver.ResolveKeyAsync($"{secretUri}/secrets/{secretName}", CancellationToken.None).GetAwaiter().GetResult(); BlobEncryptionPolicy policy = new BlobEncryptionPolicy(rsaKey, null); BlobRequestOptions options = new BlobRequestOptions { EncryptionPolicy = policy }; return options; } public static async Task GetAccessToken(string authority, string resource, string scope) { string clientId = WebConfigurationManager.AppSettings["ClientId"]; string clientSecret = WebConfigurationManager.AppSettings["ClientSecret"]; ClientCredential clientCredential = new ClientCredential(clientId, clientSecret); AuthenticationContext authenticationContext = new AuthenticationContext(authority, TokenCache.DefaultShared); AuthenticationResult result = await authenticationContext.AcquireTokenAsync(resource, clientCredential); if (result == null) { throw new InvalidOperationException( "GetAccessToken - Failed to obtain the Active Directory token for application."); } *3 return result.AccessToken; } public async Task CreateEncryptedBlobFromByteArray(IStorageManager storageManager, string containerName, string fileName, byte[] byteArray, string contentType, BlobRequestOptions options) { CloudBlobContainer container = await CreateStorageContainerIfNotExists(storageManager, containerName); CloudBlockBlob blob = container.GetBlockBlobReference(fileName); blob.Properties.ContentType = contentType; await blob.UploadFromByteArrayAsync(byteArray, 0, byteArray.Length, AccessCondition.GenerateEmptyCondition(), options, new OperationContext()); }
この行...
IKey rsaKey = keyVaultKeyResolver.ResolveKeyAsync($"{secretUri}/secrets/{secretName}", CancellationToken.None).GetAwaiter().GetResult();
は常にnullを返します:
は、ここに私のコードです。
上記のコードでブレークポイント(* 1〜* 3)を追加し、* 2が* 3より前に常にヒットすることに気付きました。これは、KeyVaultKeyResolver(GetAccessToken)呼び出しがGetAccessToken呼び出しが値を返してくるのを待っていないことを意味します。
私が間違っていることについてのアイデアはありますか?