Серверу не удалось аутентифицировать запрос. Убедитесь, что значение заголовка авторизации является правильным. Использование механизма DataProtection - PullRequest
0 голосов
/ 13 марта 2019

Я использую защиту данных с помощью сохраняемых ключей для хранилища 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 часа пользователь входит в приложение, возникает такая ошибка:

enter image description here

Серверу не удалось аутентифицировать запрос.Убедитесь, что значение заголовка авторизации сформировано правильно, включая подпись.

Но это происходит только в первый раз.После второй попытки входа токен обновляется корректно.Что я здесь не так делаю?Как заставить внедрение AddDataProtection на Startup.cs обновляться каждый раз, когда я пытаюсь прочитать Blob?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...