服务器无法验证请求。确保Authorization标头的值正确。使用DataProtection机制

时间:2019-03-13 10:55:14

标签: azure encryption asp.net-core azure-storage-blobs azure-keyvault

我将数据保护与Azure Blob存储的持久密钥一起使用(与ProtectKeysWithAzureKeyVault一起使用)。

我正在努力解决一个问题,该问题已过期,在依赖注入期间使用Sas Token生成了Blob Uri。

Startup.cs中AddDataProtection方法的初始化

  var keyVaultClient = new KeyVaultClient(
               new KeyVaultClient.AuthenticationCallback(new AzureServiceTokenProvider().KeyVaultTokenCallback));

        services.AddDataProtection()
            .SetApplicationName("API")
            .PersistKeysToAzureBlobStorage(new Uri(ConfigurationSettings.GetBlobSasUri(Configuration["StorageAccounts:ConnectionString"], Configuration["DataProtectionBlobStorage:BlobContainer"], Configuration["DataProtectionBlobStorage:BlobName"])))
            .ProtectKeysWithAzureKeyVault(keyVaultClient,$"{Configuration["KeyVault:Url"]}keys/datakeysprotection");

然后会生成15分钟的有效期的BlobSasUri。

public static string GetBlobSasUri(string connectionString, string containerName, string blobName)
    {
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
        CloudBlobContainer container = blobClient.GetContainerReference(containerName);

        container.CreateIfNotExistsAsync().ContinueWith(res => {
            if (res.Result)
            {
                container.SetPermissionsAsync(new BlobContainerPermissions
                {
                    PublicAccess = BlobContainerPublicAccessType.Off
                });
            }
        });

        CloudBlockBlob blob = container.GetBlockBlobReference(blobName);

        SharedAccessBlobPolicy sasConstraints =
           new SharedAccessBlobPolicy
           {
               SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(15), // 15 minutes expired
               Permissions = SharedAccessBlobPermissions.Read | SharedAccessBlobPermissions.Write  //Read & Write
           };

        //Generate the shared access signature on the blob, setting the constraints directly on the signature.
        string sasBlobToken = blob.GetSharedAccessSignature(sasConstraints);

        return blob.Uri + sasBlobToken;
    }

它在localhost上运行良好,因为计算机经常重新启动。当此解决方案在线发布时,它可以在短时间内很好地工作,但是当它持续约1天时,服务器会将发布日期保留在blob uri令牌内。它在24小时后不会(应有)刷新令牌,并保留旧的Blob uri sas令牌。

  

数据保护系统初始化时,将从底层存储库中读取密钥环并将其缓存在内存中。此缓存允许保护和取消保护操作继续进行,而无需访问后备存储。系统将大约每24小时或当前默认密钥到期时(以先到者为准)自动检查后备存储是否有更改。   https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/implementation/key-management?view=aspnetcore-2.2#key-storage

用户在24h后登录应用时,会发生此类错误:

enter image description here

服务器无法验证请求。确保正确构成Authorization标头的值(包括签名)。

但是它仅是第一次发生。第二次登录后,令牌会正确刷新。我在这里做什么错?每当我尝试读取Blob时,如何强制Startup.cs上的AddDataProtection依赖项注入刷新?

0 个答案:

没有答案