Я использую защиту данных с помощью сохраняемых ключей для хранилища BLOB-объектов Azure (с ProtectKeysWithAzureKeyVault).
Я борюсь с проблемой, срок действия которой сгенерирован. Blob Uri With Sas Token во время injeciton зависимости.
Инициализация метода AddDataProtection внутри Startup.cs
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");
Затем создается BlobSasUri с продолжительностью истечения 15 минут.
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;
}
Хорошо работает на локальном хосте, потому что машинаперезапускается довольно часто.Когда это решение публикуется в Интернете, оно работает хорошо в течение короткого времени, но когда оно длится около 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
Когда через 24 часа пользователь входит в приложение, возникает такая ошибка:
Серверу не удалось аутентифицировать запрос.Убедитесь, что значение заголовка авторизации сформировано правильно, включая подпись.
Но это происходит только в первый раз.После второй попытки входа токен обновляется корректно.Что я здесь не так делаю?Как заставить внедрение AddDataProtection на Startup.cs обновляться каждый раз, когда я пытаюсь прочитать Blob?