以前は、次のようにv11 Azure SDK APIを使用してBlobに共有アクセス署名を作成できました。
var containerName = "mycontainer";
var blobName = "myblob";
CloudStorageAccount storageAccount
= CloudStorageAccount.Parse(<StorageConnectionString>);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference(containerName);
SharedAccessBlobPermissions permission = SharedAccessBlobPermissions.Read;
TimeSpan clockSkew = TimeSpan.FromMinutes(15d);
TimeSpan accessDuration = TimeSpan.FromMinutes(15d);
var blobSAS = new SharedAccessBlobPolicy
{
SharedAccessStartTime = DateTime.UtcNow.Subtract(clockSkew),
SharedAccessExpiryTime = DateTime.UtcNow.Add(accessDuration) + clockSkew,
Permissions = permissions
};
CloudBlockBlob blob = container.GetBlockBlobReference(blobName);
string sasBlobToken = blob.GetSharedAccessSignature(blobSAS);
...
CloudBlobClient
をBlobServiceClient
で、CloudBlobContainer
をBlobContainerClient
で、CloudBlockBlob
をBlobClient
で置き換える最新のv12 .NET APIを使用したいと思います。
ただし、GetSharedAccessSignature
インスタンスで使用できるメソッドCloudBlockBlob
は、BlobClient
インスタンスでは使用できません。
質問
最新のAzure SDK .NET API v12を使用して、BlobClient
インスタンスから共有アクセス署名を取得する方法
Sajeetharanの回答から、実際に存在する BlobSasBuilder クラスを探しました。
これは、サーバー上で構築する方法です。
// Creates a client to the BlobService using the connection string.
var blobServiceClient = new BlobServiceClient(storageConnectionString);
// Gets a reference to the container.
var blobContainerClient = blobServiceClient.GetBlobContainerClient(<ContainerName>);
// Gets a reference to the blob in the container
BlobClient blobClient = containerClient.GetBlobClient(<BlobName>);
// Defines the resource being accessed and for how long the access is allowed.
var blobSasBuilder = new BlobSasBuilder
{
StartsOn = DateTime.UtcNow.Subtract(clockSkew),
ExpiresOn = DateTime.UtcNow.Add(accessDuration) + clockSkew,
BlobContainerName = <ContainerName>,
BlobName = <BlobName>,
};
// Defines the type of permission.
blobSasBuilder.SetPermissions(BlobSasPermissions.Write);
// Builds an instance of StorageSharedKeyCredential
var storageSharedKeyCredential = new StorageSharedKeyCredential(<AccountName>, <AccountKey>);
// Builds the Sas URI.
BlobSasQueryParameters sasQueryParameters = blobSasBuilder.ToSasQueryParameters(storageSharedKeyCredential);
クライアント側での使用方法は次のとおりです。
// Builds the URI to the blob storage.
UriBuilder fullUri = new UriBuilder()
{
Scheme = "https",
Host = string.Format("{0}.blob.core.windows.net", <AccountName>),
Path = string.Format("{0}/{1}", <ContainerName>, <BlobName>),
Query = sasQueryParameters.ToString()
};
// Get an instance of BlobClient using the URI.
var blobClient = new BlobClient(fullUri.Uri, null);
// Upload stuff in the blob.
await blobClient.UploadAsync(stream);
NET用のAzure Blobストレージクライアントライブラリv12の使用:
BlobSasBuilder blobSasBuilder = new BlobSasBuilder()
{
BlobContainerName = blobContainerName,
BlobName = blobName,
Resource = "b", //b = blob, c = container
StartsOn = DateTimeOffset.UtcNow,
ExpiresOn = DateTimeOffset.UtcNow.AddMinutes(lifetimeMinutes)
};
blobSasBuilder.SetPermissions(BlobSasPermissions.Read);
StorageSharedKeyCredential storageSharedKeyCredential = new StorageSharedKeyCredential(accountName, accountKey);
string sas = blobSasBuilder.ToSasQueryParameters(storageSharedKeyCredential).ToString();
かなりの量の調査の後、私はこれに関するいくつかのマイクロソフトのドキュメントを見つけました: https://docs.Microsoft.com/en-us/Azure/storage/blobs/storage-blob-user-delegation-sas- create-dotnet
これは、アカウント委任キーの代わりにユーザー委任キーを使用してSAS=を生成することですが、他の回答で説明されている.ToSasQueryParameters()への異なるオーバーロードです。
これを接続するための記事からの主要なスニペット。まず、BlobServiceClientを作成します。
// Construct the blob endpoint from the account name.
string blobEndpoint = string.Format("https://{0}.blob.core.windows.net", accountName);
// Create a new Blob service client with Azure AD credentials.
BlobServiceClient blobClient = new BlobServiceClient(new Uri(blobEndpoint),
new DefaultAzureCredential());
ユーザー委任キーを取得します。これはSASの生成に使用されます。
// Get a user delegation key for the Blob service that's valid for seven days.
// You can use the key to generate any number of shared access signatures over the lifetime of the key.
UserDelegationKey key = await blobClient.GetUserDelegationKeyAsync(DateTimeOffset.UtcNow,
DateTimeOffset.UtcNow.AddDays(7));
最後にSAS URI:
// Create a SAS token that's valid for one hour.
BlobSasBuilder sasBuilder = new BlobSasBuilder()
{
BlobContainerName = containerName,
BlobName = blobName,
Resource = "b",
StartsOn = DateTimeOffset.UtcNow,
ExpiresOn = DateTimeOffset.UtcNow.AddHours(1)
};
// Specify read permissions for the SAS.
sasBuilder.SetPermissions(BlobSasPermissions.Read);
// Use the key to get the SAS token.
string sasToken = sasBuilder.ToSasQueryParameters(key, accountName).ToString();
// Construct the full URI, including the SAS token.
UriBuilder fullUri = new UriBuilder()
{
Scheme = "https",
Host = string.Format("{0}.blob.core.windows.net", accountName),
Path = string.Format("{0}/{1}", containerName, blobName),
Query = sasToken
};
あなたは
SharedAccessBlobPolicy sasConstraints = new SharedAccessBlobPolicy
{
// Expiration is in 12 hours.
SharedAccessExpiryTime = DateTime.UtcNow.AddHours(12),
Permissions = permissions
};
そして値を渡します
// Generate the shared access signature on the container, setting the constraints directly on the signature
CloudBlobContainer container = blobClient.GetContainerReference(containerName);
string sasContainerToken = container.GetSharedAccessSignature(sasConstraints);
V12では、次のことができます
StorageSharedKeyCredential Credential = new StorageSharedKeyCredential(accountName, accountKey);
// Use the key to get the SAS token.
string sasToken = accountSasBuilder.ToSasQueryParameters(Credential).ToString();
private string BuildSASUri(BlobClient blob)
{
// Create a user SAS that only allows reading for a minute
BlobSasBuilder sas = new BlobSasBuilder
{
BlobContainerName = blob.BlobContainerName,
BlobName = blob.Name,
Resource = "b",
ExpiresOn = DateTimeOffset.UtcNow.AddMinutes(1)
};
// Allow read access
sas.SetPermissions(BlobSasPermissions.Read);
var storageSharedKeyCredential = new StorageSharedKeyCredential(
_iconfiguration.GetValue<string>("StorageAccount:AccountName"),
_iconfiguration.GetValue<string>("StorageAccount:AccountKey")
);
return sas.ToSasQueryParameters(storageSharedKeyCredential).ToString();
}
上記は私の作業コードです。
ただし、V12でストアドアクセスポリシーを作成する方法はわかりません。これは次のようになります: https://docs.Microsoft.com/en-us/dotnet/api/Azure.storage.blobs.blobcontainerclient.setaccesspolicy?view=Azure-dotnet
しかし、マイクロソフトはBlobSignedIdentifierを作成する方法を提供することを完全に忘れていたと思います。
ドキュメントは古くなっています: https://docs.Microsoft.com/en-us/Azure/storage/common/storage-stored-access-policy-define-dotnet?toc=%2fazure%2fstorage% 2fblobs%2ftoc.json
これはMicrosoft.Azure.Storage.Blobを使用していますが、 https://www.nuget.org/packages/Microsoft.Azure.Storage.Blob/ はもう使用しないと言っています。