Маркер 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();
что вызывает следующую ошибку:
Любая помощь будет принята с благодарностью.
1 ответ
Согласно моему тесту, service.GetPropertiesAsync();
это действие в отношении аккаунта. Это означает, что он вызовет 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