Маркер SAS Azure не работает с Azure.Storage.Blobs BlobServiceClient

Я использую Azure.Storage.Blobs v12.1.0 библиотеку. Я создаю токен SAS уровня больших двоичных объектов, используя делегирование пользователей с учетными данными участника службы Azure, и пытаюсь отправить большой двоичный объект с помощью созданного маркера SAS. Я точно следил за этот пример кода из Azure для создания токена SAS.

Вот код, который я использую для создания токена SAS:

string blobEndpoint = string.Format("https://{0}.blob.core.windows.net", storageProviderSettings.AccountName);

        TokenCredential credential =
            new ClientSecretCredential(
                storageProviderSettings.TenantId,
                storageProviderSettings.ClientId,
                storageProviderSettings.ClientSecret,
                new TokenCredentialOptions());

        BlobServiceClient blobServiceClient = new BlobServiceClient(new Uri(blobEndpoint),
                                                            credential);

        BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(containerName);
        BlobClient blobClient = containerClient.GetBlobClient(blobName);

        var delegationKey = await blobServiceClient.GetUserDelegationKeyAsync(DateTimeOffset.UtcNow, DateTimeOffset.UtcNow.AddDays(7));
        BlobSasBuilder sasBuilder = new BlobSasBuilder()
        {
            BlobContainerName = containerName,
            BlobName = blobName,
            Resource = "b",
            StartsOn = DateTimeOffset.UtcNow,
            ExpiresOn = DateTimeOffset.UtcNow.AddSeconds(expirySeconds)
        };
        sasBuilder.SetPermissions(BlobSasPermissions.All);
        // if (withDownloadAccess) {
        //     sasBuilder.SetPermissions(BlobSasPermissions.Read);
        // }
        // if (withDeleteAccess) {
        //     sasBuilder.SetPermissions(BlobSasPermissions.Delete);
        // }
        Console.WriteLine(sasBuilder.Permissions);
        var sasQueryParams = sasBuilder.ToSasQueryParameters(delegationKey, storageProviderSettings.AccountName).ToString();
        UriBuilder sasUri = new UriBuilder()
        {
            Scheme = "https",
            Host = string.Format("{0}.blob.core.windows.net", storageProviderSettings.AccountName),
            Path = string.Format("{0}/{1}", containerName, blobName),
            Query = sasQueryParams
        };

        BlobServiceClient service = new BlobServiceClient(sasUri.Uri);

        await service.GetPropertiesAsync();

        Settings tmpUploadCredentials = CreateTemporaryAzureStorageProviderSettings(sasUri, storageProviderSettings);

        Console.WriteLine(tmpUploadCredentials.ConnectionString);
        return tmpUploadCredentials;

Создан токен SAS, и Get Blob работает отлично, если я сохраняю его в браузере, но использую BlobServiceClient, если я пытаюсь загрузить файл или выполнить какое-либо действие, которое теперь работает. Чтобы проверить, аутентифицирован он или нет, я написал эту строку await service.GetPropertiesAsync();, которая выдает следующую ошибку:

Это ошибка

Любая помощь будет принята с благодарностью.


person Haresh    schedule 18.12.2019    source источник


Ответы (1)


Согласно моему тесту, service.GetPropertiesAsync(); - это действие в отношении учетной записи. Это означает, что он вызовет Get Blob Service Properties rest api, чтобы получить свойства службы больших двоичных объектов учетной записи. Однако при создании BlobServiceClient вы указываете URL-адрес большого двоичного объекта. Большой двоичный объект не поддерживает действие. Так вы получите ошибку. Он захочет получить свойства большого двоичного объекта, пожалуйста, вызовите api. Итак, обновите свой код следующим образом


 BlobClient blobClient = new BlobClient(sasUri, null);
blobClient.GetPropertiesAsync();

Дополнительные сведения см. В https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-user-delegation-sas-create-dotnet#get-the-ключ-делегированиепользователя

person Jim Xu    schedule 19.12.2019
comment
Большое спасибо, Джим !!! Совершал простую ошибку, пытаясь создать blobServiceClient с URI Sas, что не имеет смысла, это должен быть BlobClient. Но в ссылку, которую я вставил, они создавали BlobServiceClient с URI. Это вводит в заблуждение многих людей, поэтому я поднял вопрос в azure-sdk-net. Еще раз большое спасибо, чувак !! - person Haresh; 19.12.2019