azure-blob-storage - 特定文件的 Azure SAS 令牌
问题描述
我正在使用 Azure Data Lake(使用分层命名空间)构建文件存储 POC。我需要为存储在目录结构中的特定文件生成 SAS 令牌。我找不到任何这样做的例子。欣赏是否有任何指针或代码片段来执行此操作。
解决方案
您可以在之前的代码中实现如下:
我只是将生成的 Blob SAS URL 写入文件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();
}
}
}
以下是单个文件的实际 Blob SAS URL 的my-file
外观:
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
推荐阅读
- c# - 如何防止旧版本的 C# dll 运行
- python - Python groupby 多索引
- graphql - 如何仅从 Prisma / GraphQL 查询中获取过滤后的数据
- html - 如何在 CSS 中的形状上放置一个按钮?
- javascript - 如何在echarts中显示总和堆栈栏
- sql-server - Azure SQL Managed Instance - Create Credential not supported
- c# - 有没有办法在 C# 中使用全局计时器?一种可用于多种形式的
- azure - List of all Resources in my Azure Subscription + IAM Access Control Credentials
- java - MockMVC - How to check the content of a JWT token in a spring security integration test with org.hamcrest.Matcher
- css - 物化 CSS 模态在另一个模态中被裁剪