ASP.Net Core 2.2 - токены Azure SAS? - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь выяснить, как сгенерировать токен для пользователей для доступа к данным, которые хранятся в контейнере BLOB-объектов учетной записи хранения Azure. Пользователи загружают различные данные (PDF-файлы, изображения), но я не хочу, чтобы ссылки на эти данные были общедоступными. Рекомендованной стратегией было использование токена SAS, который мне удалось заставить работать под .Net с помощью следующей функции, которую я нашел на сайте MS около года назад:

        //Function for getting a temporary Azure SAS 
        public static string GetAzureSASToken(string userhashid, int minutes)
        {

            //Get Azure SAS Token so we can allow them to temporarily view the photos 
            UploadedFileInfo uploadedfileinfo = new UploadedFileInfo();

            //Azure User containter must be all lowercase!!
            uploadedfileinfo.usercontainer = "user-" + userhashid;
            uploadedfileinfo.azureurl = ConfigurationManager.AppSettings["AzureURL"].ToString() + uploadedfileinfo.usercontainer + "/";


            // Retrieve storage account from connection string.
            string azureconnection = CloudConfigurationManager.GetSetting("StorageConnectionString");

            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(azureconnection);

            CloudBlobClient client = storageAccount.CreateCloudBlobClient();
            CloudBlobContainer blobContainer = client.GetContainerReference(uploadedfileinfo.usercontainer);

            //Set the expiry time and permissions for the container.
            //In this case no start time is specified, so the shared access signature becomes valid immediately.
            SharedAccessBlobPolicy sasConstraints = new SharedAccessBlobPolicy();
            sasConstraints.SharedAccessExpiryTime = DateTimeOffset.UtcNow.AddMinutes(minutes);
            sasConstraints.Permissions = SharedAccessBlobPermissions.Read;

            //Generate the shared access signature on the container, setting the constraints directly on the signature.
            string sasContainerToken = blobContainer.GetSharedAccessSignature(sasConstraints);

            return sasContainerToken;

        }

Проблема в том, что ятеперь нужно получить доступ к этим файлам из приложения Asp.Net Core 2.2 , и я не могу понять, как реплицировать код для получения токена (библиотеки Core разные)

Любые предложения о том, как сделать это в .Net Core 2.2?

Спасибо!

1 Ответ

1 голос
/ 08 ноября 2019

Просто установите последний пакет nuget Microsoft.Azure.Storage.Blob -Version 11.1.0 .

Затем ваш код ядра .net (такой же, как код .net framework в вашем посте)) может хорошо работать с кодом .net framework.

Вот пример кода .net core 2.2. Я не читал настройки из файла конфигурации, поэтому он немного отличается:

using Microsoft.Azure.Storage;
using Microsoft.Azure.Storage.Auth;
using Microsoft.Azure.Storage.Blob;
using System;

namespace ConsoleApp5
{
    class Program
    {
        static void Main(string[] args)
        {
            string sas = GetAzureSASToken();

            Console.WriteLine(sas);
            Console.ReadLine();
        }

        public static string GetAzureSASToken()
        {

            string accountName = "xxx";
            string accountKey = "xxx";

            CloudStorageAccount storageAccount = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);

            CloudBlobClient client = storageAccount.CreateCloudBlobClient();
            CloudBlobContainer blobContainer = client.GetContainerReference("test1");

            //Set the expiry time and permissions for the container.
            //In this case no start time is specified, so the shared access signature becomes valid immediately.
            SharedAccessBlobPolicy sasConstraints = new SharedAccessBlobPolicy();
            sasConstraints.SharedAccessExpiryTime = DateTimeOffset.UtcNow.AddMinutes(5);
            sasConstraints.Permissions = SharedAccessBlobPermissions.Read;

            //Generate the shared access signature on the container, setting the constraints directly on the signature.
            string sasContainerToken = blobContainer.GetSharedAccessSignature(sasConstraints);

            return sasContainerToken;
        }
    }
}

И результат теста:

enter image description here

...