C# MVC Web 应用服务连接到 Azure 存储 Blob

Posted

技术标签:

【中文标题】C# MVC Web 应用服务连接到 Azure 存储 Blob【英文标题】:C# MVC Web App Service Connect to Azure Storage Blob 【发布时间】:2017-11-01 21:22:21 【问题描述】:

我有一个连接到数据库的 C# MVC 基本 Web 应用程序(我是 MVC 新手)。在该数据库中有一个包含文件名列表的表。这些文件存储在 Azure 存储 Blob 容器中。

我使用 Scaffolding(创建一个控制器和视图)来显示我的文件名表中的数据并且效果很好。

现在我想将这些文件名连接到 blob 存储,以便用户可以单击并打开它们。我如何做到这一点?

我要编辑索引视图吗?我是否让用户单击文件名,然后连接到 Azure 存储以打开该文件?这是怎么做到的?

请注意,存储中的文件是私有的,可以使用存储密钥进行访问。文件不能公开。

感谢您的建议。

[更新]

我已经使用下面的代码实现了共享访问签名 (SAS)。

public static string GetSASUrl(string containerName)
    
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
        CloudBlobContainer container = blobClient.GetContainerReference(containerName);
        BlobContainerPermissions containerPermissions = new BlobContainerPermissions();
        containerPermissions.SharedAccessPolicies.Add("twominutepolicy", new SharedAccessBlobPolicy()
        
            SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-1),
            SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(2),
            Permissions = SharedAccessBlobPermissions.Write | SharedAccessBlobPermissions.Read
        );
        containerPermissions.PublicAccess = BlobContainerPublicAccessType.Off;
        container.SetPermissions(containerPermissions);
        string sas = container.GetSharedAccessSignature(new SharedAccessBlobPolicy(), "twominutepolicy");
        return sas;
    

    public static string GetSasBlobUrl(string containerName, string fileName, string sas)
    
        // Create new storage credentials using the SAS token.
        StorageCredentials accountSAS = new StorageCredentials(sas);
        // Use these credentials and the account name to create a Blob service client.
        CloudStorageAccount accountWithSAS = new CloudStorageAccount(accountSAS, [Enter Account Name], endpointSuffix: null, useHttps: true);
        CloudBlobClient blobClientWithSAS = accountWithSAS.CreateCloudBlobClient();

        // Retrieve reference to a previously created container.
        CloudBlobContainer container = blobClientWithSAS.GetContainerReference(containerName);

        // Retrieve reference to a blob named "photo1.jpg".
        CloudBlockBlob blockBlob = container.GetBlockBlobReference(fileName);

        return blockBlob.Uri.AbsoluteUri + sas;
    

【问题讨论】:

【参考方案1】:

为了访问不公开的 blob,您需要使用共享访问签名,这样,您将创建在一段时间内有效的访问令牌(您可以选择),您还可以通过以下方式进行限制IP 地址。

更多信息在这里:

https://docs.microsoft.com/en-us/azure/storage/storage-dotnet-shared-access-signature-part-1

由于它们不是公开的,因此您需要在将数据传递到视图之前添加一个额外的步骤,即将 SAS 令牌连接到 blob Uri。你可以在这里找到一个很好的例子:http://www.dotnetcurry.com/windows-azure/901/protect-azure-blob-storage-shared-access-signature

【讨论】:

非常感谢您提供的信息,帮助我解决了我的问题。最后一个链接有点过时了,不过我已经用我认为正确的更新代码更新了我的问题。

以上是关于C# MVC Web 应用服务连接到 Azure 存储 Blob的主要内容,如果未能解决你的问题,请参考以下文章

Azure asp.net Web 应用程序尝试连接到 Oracle 运行时集成链接服务

Azure C# 应用服务 ODBC 连接到 Redshift

C# 使用 REST API 连接到 Azure 媒体服务帐户

如何使用 SAS 令牌从 C# 连接到 Azure BlobStorage?

来自 C# 的 Azure SQL DB 连接问题

通过 IP 地址连接到 Azure Web App(使用应用服务环境)