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