web-dev-qa-db-ja.com

最新のAzure SDK .NET API v12を使用してBlobで共有アクセス署名を取得する方法

以前は、次のように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);

...

CloudBlobClientBlobServiceClientで、CloudBlobContainerBlobContainerClientで、CloudBlockBlobBlobClientで置き換える最新のv12 .NET APIを使用したいと思います。

ただし、GetSharedAccessSignatureインスタンスで使用できるメソッドCloudBlockBlobは、BlobClientインスタンスでは使用できません。

質問

最新のAzure SDK .NET API v12を使用して、BlobClientインスタンスから共有アクセス署名を取得する方法

2
Kzrystof

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);
3
Kzrystof

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();
0
below43

かなりの量の調査の後、私はこれに関するいくつかのマイクロソフトのドキュメントを見つけました: 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
};
0
Chris Alexander

あなたは

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();

SAMPLE CODE

0
Sajeetharan
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/ はもう使用しないと言っています。

0
Phil Stollery