Search code examples
azure-blob-storageazure-data-lake

Azure SAS Token for a specific file


I'm building a file storage POC using Azure Data Lake (using hierarchical namespace). I need to generate SAS Token for a specific file stored in a directory structure. I couldn't find any example for doing this. Appreciate if there are any pointers or code snippet to do this.


Solution

  • You can implement in your earlier code as below:

    I am simply writing the generated Blob SAS URL to a file WriteLines.txt

    using Azure;
    using Azure.Storage;
    using Azure.Storage.Files.DataLake;
    using Azure.Storage.Files.DataLake.Models;
    using Azure.Storage.Sas;
    using System;
    using System.Collections.Generic;
    using System.Threading.Tasks;
    using NUnit.Framework;
    using System.IO;
    
    namespace DataLakeHelloWorld
    {
        class Program
        {
           
    
            static void Main(string[] args)
            {
                Console.WriteLine("Starting....");
                try
                {
                    Console.WriteLine("Executing...");
                    CreateFileClientAsync_DirectoryAsync().Wait();
                    Console.WriteLine("Done");
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
            }
    
    
            static async Task CreateFileClientAsync_DirectoryAsync()
            {
                // Make StorageSharedKeyCredential to pass to the serviceClient
                string storageAccountName = "kteststorageeadls";
                string storageAccountKey = "6fAe+K8ARe8LH9Ah2HuLuEONpxxxxxxxxxSjLy3oVPAgj04m+zWZuy5X8p4/BaQTY8efzCj/X+On/FwmvgSo6g==";
                string dfsUri = "https://" + "kteststorageeadls" + ".dfs.core.windows.net";
    
                StorageSharedKeyCredential sharedKeyCredential = new StorageSharedKeyCredential(storageAccountName, storageAccountKey);
    
                // Create DataLakeServiceClient using StorageSharedKeyCredentials
                DataLakeServiceClient serviceClient = new DataLakeServiceClient(new Uri(dfsUri), sharedKeyCredential);
    
                // Create a DataLake Filesystem
                DataLakeFileSystemClient filesystem = serviceClient.GetFileSystemClient("my-filesystem-dfs");
                if (!await filesystem.ExistsAsync())
                    await filesystem.CreateAsync();
    
                //Create a DataLake Directory
                DataLakeDirectoryClient directory = filesystem.CreateDirectory("my-dir");
                if (!await directory.ExistsAsync())
                    await directory.CreateAsync();
    
                // Create a DataLake File using a DataLake Directory
                DataLakeFileClient file = directory.GetFileClient("my-file");
                if (!await file.ExistsAsync())
                    await file.CreateAsync();
    
                // Verify we created one file
                var response = filesystem.GetPathsAsync();
                IAsyncEnumerator<PathItem> enumerator = response.GetAsyncEnumerator();
                Console.WriteLine(enumerator?.Current?.Name);
    
                //**********Start-add-from-here************
    
                DataLakeSasBuilder dataLakeSasBuilder = new DataLakeSasBuilder
                {
                    StartsOn = DateTimeOffset.UtcNow.AddHours(-1),
                    ExpiresOn = DateTimeOffset.UtcNow.AddHours(1),
                    FileSystemName = file.FileSystemName.ToString()
                };
    
                dataLakeSasBuilder.SetPermissions(DataLakeFileSystemSasPermissions.Read);
    
                DataLakeUriBuilder dataLakeUriBuilder = new DataLakeUriBuilder(file.Uri)
                {
                    Sas = dataLakeSasBuilder.ToSasQueryParameters(sharedKeyCredential)
                };
    
                DataLakeFileSystemClient sasFileSystemClient = new DataLakeFileSystemClient(dataLakeUriBuilder.ToUri());
    
                // To debug writing the SAS URL to a file in project dir
                Console.WriteLine(sasFileSystemClient);
                string name = sasFileSystemClient.Uri.ToString();
                File.WriteAllTextAsync("WriteLines.txt", name);
    
                //**********end************
    
                // Cleanup
                //await filesystem.DeleteAsync();
    
            }
    
        }
    }
    

    enter image description here

    Here is how the actual Blob SAS URL for a single file my-file looks:

    https://kteststorageeadls.dfs.core.windows.net/my-filesystem-dfs/my-dir/my-file?sv=2020-08-04&st=2021-10-13T15%3A39%3A26Z&se=2021-10-13T17%3A36%3A26Z&sr=c&sp=r&sig=APeC5UTh7fEkzL5czAM%2B124XXE9zw%2FpTJLuvlqVQEko%3D