我将数据保护与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后登录应用时,会发生此类错误:
服务器无法验证请求。确保正确构成Authorization标头的值(包括签名)。
但是它仅是第一次发生。第二次登录后,令牌会正确刷新。我在这里做什么错?每当我尝试读取Blob时,如何强制Startup.cs上的AddDataProtection依赖项注入刷新?