建立容器或 blob 的服務 SAS

共用存取簽章 (SAS) 可讓您對儲存體帳戶中的容器和 blob 授與有限的存取權。 當您建立 SAS 時,需要指定其條件約束,包括允許用戶端存取的 Azure 儲存體資源、對這些資源的使用權限,以及 SAS 的有效期限。

每個 SAS 都會以金鑰簽署。 您可以使用下列兩種方式之一簽署 SAS:

  • 使用透過 Azure Active Directory (Azure AD) 認證建立的金鑰。 使用 Azure AD 認證簽署的 SAS 是一種使用者委派 SAS。 凡建立使用者委派 SAS 的用戶端,都必須被指派包含下列動作的 Azure RBAC 角色:Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey。 如需詳細資訊,請參閱建立使用者委派 SAS
  • 使用儲存體帳戶金鑰。 服務 SAS帳戶 SAS 都使用儲存體帳戶金鑰加以簽署。 凡建立服務 SAS 的用戶端,都必須具備帳戶金鑰的直接存取權,或者被指派 Microsoft.Storage/storageAccounts/listkeys/action 使用權限。

注意

使用者委派 SAS 可以為使用儲存體帳戶金鑰簽署的 SAS 提供絕佳的安全性。 Microsoft 建議盡可能採用使用者委派 SAS。 如需詳細資訊,請參閱使用共用存取簽章 (SAS) 授與資料的有限存取權

本文說明如何使用儲存體帳戶金鑰,搭配適用於 Blob 儲存體的 Azure Blob 儲存體用戶端程式庫,建立容器或 blob 的服務 SAS。

建立容器或 blob 的服務 SAS

下列程式碼範例會建立容器的 SAS。 如果提供現有預存存取原則的名稱,該原則將與 SAS 相關聯。 如果未提供任何預存存取原則,則程式碼會在容器上建立臨機操作 SAS。

服務 SAS 會使用帳戶存取金鑰加以簽署。 使用 StorageSharedKeyCredential 類別,建立用來簽署 SAS 的認證。

在下列範例中,以您的帳戶名稱、帳戶金鑰和容器名稱填入常數:

const string AccountName = "<account-name>";
const string AccountKey = "<account-key>";
const string ContainerName = "<container-name>";

Uri blobContainerUri = new(string.Format("https://{0}.blob.core.windows.net/{1}", 
    AccountName, ContainerName));

StorageSharedKeyCredential storageSharedKeyCredential = 
    new(AccountName, AccountKey);

BlobContainerClient blobContainerClient = 
    new(blobContainerUri, storageSharedKeyCredential);

接著,建立新的 BlobSasBuilder 物件,並呼叫 ToSasQueryParameters 以取得 SAS 權杖字串。

private static Uri GetServiceSasUriForContainer(BlobContainerClient containerClient,
                                          string storedPolicyName = null)
{
    // Check whether this BlobContainerClient object has been authorized with Shared Key.
    if (containerClient.CanGenerateSasUri)
    {
        // Create a SAS token that's valid for one hour.
        BlobSasBuilder sasBuilder = new BlobSasBuilder()
        {
            BlobContainerName = containerClient.Name,
            Resource = "c"
        };

        if (storedPolicyName == null)
        {
            sasBuilder.ExpiresOn = DateTimeOffset.UtcNow.AddHours(1);
            sasBuilder.SetPermissions(BlobContainerSasPermissions.Read);
        }
        else
        {
            sasBuilder.Identifier = storedPolicyName;
        }

        Uri sasUri = containerClient.GenerateSasUri(sasBuilder);
        Console.WriteLine("SAS URI for blob container is: {0}", sasUri);
        Console.WriteLine();

        return sasUri;
    }
    else
    {
        Console.WriteLine(@"BlobContainerClient must be authorized with Shared Key 
                          credentials to create a service SAS.");
        return null;
    }
}

建立 blob 的服務 SAS

下列程式碼範例會在 blob 上建立 SAS。 如果提供現有預存存取原則的名稱,該原則將與 SAS 相關聯。 如果未提供任何預存存取原則,則程式碼會在 blob 上建立臨機操作 SAS。

服務 SAS 會使用帳戶存取金鑰加以簽署。 使用 StorageSharedKeyCredential 類別,建立用來簽署 SAS 的認證。

在下列範例中,以您的帳戶名稱、帳戶金鑰和容器名稱填入常數:

const string AccountName = "<account-name>";
const string AccountKey = "<account-key>";
const string ContainerName = "<container-name>";

Uri blobContainerUri = new(string.Format("https://{0}.blob.core.windows.net/{1}", 
    AccountName, ContainerName));

StorageSharedKeyCredential storageSharedKeyCredential = 
    new(AccountName, AccountKey);

BlobContainerClient blobContainerClient = 
    new(blobContainerUri, storageSharedKeyCredential);

接著,建立新的 BlobSasBuilder 物件,並呼叫 ToSasQueryParameters 以取得 SAS 權杖字串。

private static Uri GetServiceSasUriForBlob(BlobClient blobClient,
    string storedPolicyName = null)
{
    // Check whether this BlobClient object has been authorized with Shared Key.
    if (blobClient.CanGenerateSasUri)
    {
        // Create a SAS token that's valid for one hour.
        BlobSasBuilder sasBuilder = new BlobSasBuilder()
        {
            BlobContainerName = blobClient.GetParentBlobContainerClient().Name,
            BlobName = blobClient.Name,
            Resource = "b"
        };

        if (storedPolicyName == null)
        {
            sasBuilder.ExpiresOn = DateTimeOffset.UtcNow.AddHours(1);
            sasBuilder.SetPermissions(BlobSasPermissions.Read |
                BlobSasPermissions.Write);
        }
        else
        {
            sasBuilder.Identifier = storedPolicyName;
        }

        Uri sasUri = blobClient.GenerateSasUri(sasBuilder);
        Console.WriteLine("SAS URI for blob is: {0}", sasUri);
        Console.WriteLine();

        return sasUri;
    }
    else
    {
        Console.WriteLine(@"BlobClient must be authorized with Shared Key 
                          credentials to create a service SAS.");
        return null;
    }
}

建立目錄的服務 SAS

在啟用階層命名空間的儲存體帳戶中,您可以建立目錄的服務 SAS。 若要建立服務 SAS,請確定您已安裝 12.5.0 版或更新版本的 Azure.Storage.Files.DataLake 套件。

下列範例示範如何使用適用於 .NET 的 v12 用戶端程式庫來建立目錄的服務 SAS:

private static Uri GetServiceSasUriForDirectory(DataLakeDirectoryClient directoryClient,
                                          string storedPolicyName = null)
{
    if (directoryClient.CanGenerateSasUri)
    {
        // Create a SAS token that's valid for one hour.
        DataLakeSasBuilder sasBuilder = new DataLakeSasBuilder()
        {
            // Specify the file system name, the path, and indicate that
            // the client object points to a directory.
            FileSystemName = directoryClient.FileSystemName,
            Resource = "d",
            IsDirectory = true,
            Path = directoryClient.Path,
        };

        // If no stored access policy is specified, create the policy
        // by specifying expiry and permissions.
        if (storedPolicyName == null)
        {
            sasBuilder.ExpiresOn = DateTimeOffset.UtcNow.AddHours(1);
            sasBuilder.SetPermissions(DataLakeSasPermissions.Read |
                DataLakeSasPermissions.Write |
                DataLakeSasPermissions.List);
        }
        else
        {
            sasBuilder.Identifier = storedPolicyName;
        }

        // Get the SAS URI for the specified directory.
        Uri sasUri = directoryClient.GenerateSasUri(sasBuilder);
        Console.WriteLine("SAS URI for ADLS directory is: {0}", sasUri);
        Console.WriteLine();

        return sasUri;
    }
    else
    {
        Console.WriteLine(@"DataLakeDirectoryClient must be authorized with Shared Key 
                          credentials to create a service SAS.");
        return null;
    }
}

使用 .NET 開發資源

下列連結會為使用適用於 .NET 的 Azure 儲存體用戶端程式庫開發人員提供實用資源。

Azure 儲存體常用 API

Blob 儲存體 API

.NET 工具

使用 JavaScript 的開發作業可用資源

下列連結會為使用適用於 JavaScript 的 Azure 儲存體用戶端程式庫開發人員提供實用資源

Blob 儲存體 API

JavaScript 工具

後續步驟