配置 Azure 存储连接字符串

连接字符串包含应用程序在运行时使用共享密钥授权访问 Azure 存储帐户中的数据所需的授权信息。 可以将连接字符串配置为:

  • 连接到 Azurite 存储模拟器。
  • 在 Azure 中访问存储帐户。
  • 通过共享访问签名 (SAS) 访问 Azure 中的指定资源。

若要了解如何查看帐户访问密钥并复制连接字符串,请参阅管理存储帐户访问密钥

重要

为了获得最佳安全性,Azure 建议尽可能使用具有托管标识的 Microsoft Entra ID 来授权针对 Blob、队列和表数据的请求。 与共享密钥授权相比,使用 Microsoft Entra ID 和托管标识进行授权提供了更高的安全性和易用性。 要详细了解托管标识,请参阅什么是 Azure 资源托管标识。 有关如何为 .NET 应用程序启用和使用托管标识的示例,请参阅使用 .NET 对 Azure 资源的 Azure 托管应用进行身份验证

对于 Azure 外部托管的资源(例如本地应用程序),可以通过 Azure Arc 使用托管标识。例如,在已启用 Azure Arc 的服务器上运行的应用可以使用托管标识连接到 Azure 服务。 若要了解详细信息,请参阅使用已启用 Azure Arc 的服务器对 Azure 资源进行身份验证

对于使用共享访问签名 (SAS) 的方案,Azure 建议使用用户委托 SAS。 用户委派 SAS 通过 Microsoft Entra 凭据(而不是帐户密钥)进行保护。 若要了解共享访问签名,请参阅使用共享访问签名授予有限的数据访问权限。 有关如何通过 .NET 创建和使用用户委派 SAS 的示例,请参阅使用 .NET 为 blob 创建用户委派 SAS

保护访问密钥

存储帐户访问密钥提供对存储帐户数据的完全访问权限,以及生成 SAS 令牌的权限。 始终要小心保护访问密钥。 使用 Azure 密钥保管库安全地管理和轮换密钥。 对共享密钥的访问权限授予用户对存储帐户数据的完全访问权限。 应仔细限制和监视对共享密钥的访问。 在无法使用基于 Microsoft Entra ID 的授权的情况下,使用具有有限访问权限的用户委派 SAS 令牌。 避免对访问密钥进行硬编码,或将其以纯文本形式保存在其他人可以访问的任何位置。 如果认为访问密钥可能已被盗用,请轮换密钥。

重要

若要防止用户使用共享密钥访问存储帐户中的数据,可以对存储帐户禁用共享密钥授权。 作为安全最佳做法,建议将对数据的精细访问限制为具有所选的最小特权。 应将使用托管标识的基于 Microsoft Entra ID 的授权用于支持 OAuth 的场景。 应使用 Kerberos 或 SMTP 通过 SMB 用于 Azure 文件存储。 对于通过 REST 进行的 Azure 文件存储,可以使用 SAS 令牌。 如果不需要共享密钥访问权限以防止意外使用,则应禁用共享密钥访问。 有关详细信息,请参阅阻止对 Azure 存储帐户进行共享密钥授权

若要使用 Microsoft Entra 条件访问策略保护 Azure 存储帐户,必须禁止对存储帐户进行共享密钥授权。

如果你已禁用共享密钥访问,并且诊断日志中报告了共享密钥授权,则表示正在使用受信任的访问来访问存储。 有关更多详细信息,请参阅对 Microsoft Entra 租户中注册的资源的受信任访问

存储连接字符串

应用程序需要在运行时访问连接字符串,才能授权对 Azure 存储发出的请求。 可使用多个选项来存储你的帐户访问密钥或连接字符串:

  • 可以将帐户密钥安全地存储在 Azure Key Vault 中。 有关详细信息,请参阅关于 Azure Key Vault 托管存储帐户密钥
  • 可以将连接字符串存储在环境变量中。
  • 应用程序可在 app.config 或 web.config 文件中存储连接字符串。 将连接字符串添加到这些文件中的 AppSettings 节。

警告

以明文形式存储帐户访问密钥或连接字符串会带来安全风险,不建议这样做。 以加密格式存储帐户密钥,或迁移应用程序以使用 Microsoft Entra 授权访问存储帐户。

为 Azurite 配置连接字符串

模拟器支持单一固定的帐户和众所周知的用于共享密钥身份验证的身份验证密钥。 此帐户和密钥是允许用于模拟器的唯一共享密钥凭据。 它们分别是:

Account name: devstoreaccount1
Account key: Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==

注意

模拟器支持的身份验证密钥仅用于测试客户端身份验证代码的功能。 它没有任何安全用途。 不能在模拟器中使用生产存储帐户和密钥。 不应将开发帐户用于生产数据。

模拟器仅支持通过 HTTP 进行连接。 但是,若要访问生产性 Azure 存储帐户中的资源,建议使用 HTTPS 协议。

使用快捷方式连接到模拟器帐户

从应用程序连接到模拟器的最简单方式是在应用程序的配置文件内配置一个引用快捷方式 UseDevelopmentStorage=true 的连接字符串。 该快捷方式等效于模拟器的完整连接字符串,该字符串指定每个 Azure 存储服务的帐户名、帐户密钥和模拟器终结点:

DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;
AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;
EndpointSuffix=core.chinacloudapi.cn;
BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;
QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;
TableEndpoint=http://127.0.0.1:10002/devstoreaccount1;

下面的 .NET 代码片段显示了如何通过采用连接字符串的方法使用该快捷方式。 例如,BlobContainerClient(String, String) 构造函数采用连接字符串。

BlobContainerClient blobContainerClient = new BlobContainerClient("UseDevelopmentStorage=true", "sample-container");
blobContainerClient.CreateIfNotExists();

在调用代码片段中的代码之前,请确保模拟器正在运行。

有关 Azurite 的详细信息,请参阅使用 Azurite 模拟器进行本地 Azure 存储开发

为 Azure 存储帐户配置连接字符串

若要为 Azure 存储帐户创建连接字符串,请使用以下格式。 指示要通过 HTTPS(建议)还是 HTTP 连接到存储帐户,将 myAccountName 替换为存储帐户的名称,将 myAccountKey 替换为帐户访问密钥:

DefaultEndpointsProtocol=[http|https];AccountName=myAccountName;AccountKey=myAccountKey;EndpointSuffix=core.chinacloudapi.cn

例如,连接字符串可能如下所示:

DefaultEndpointsProtocol=https;AccountName=storagesample;AccountKey=<account-key>;EndpointSuffix=core.chinacloudapi.cn

尽管 Azure 存储支持在连接字符串中使用 HTTP 和 HTTPS,但我们强烈建议使用 HTTPS

提示

可以在 Azure 门户中找到存储帐户的连接字符串。 在存储帐户的设置中导航到“安全 + 网络”>“访问密钥”,即可看到主访问密钥和辅助访问密钥的连接字符串。

使用共享访问签名创建连接字符串

如果拥有的共享访问签名 (SAS) URL 能够授予对存储帐户中资源的访问权限,则可以在连接字符串中使用 SAS。 由于 SAS 包含验证请求所需的信息,因此带 SAS 的连接字符串将提供协议、服务终结点以及访问资源所需的凭据。

若要创建包含共享访问签名的连接字符串,请按以下格式指定该字符串:

BlobEndpoint=myBlobEndpoint;
QueueEndpoint=myQueueEndpoint;
TableEndpoint=myTableEndpoint;
FileEndpoint=myFileEndpoint;
SharedAccessSignature=sasToken

尽管连接字符串必须至少包含一个服务终结点,但每个服务终结点都是可选的。

注意

建议最好配合使用 HTTPS 与 SAS。

如果在配置文件的连接字符串中指定 SAS,可能需要为 URL 中的特殊字符编码。

服务 SAS 示例

下面是包含 Blob 存储服务 SAS 的连接字符串示例:

BlobEndpoint=https://storagesample.blob.core.chinacloudapi.cn;
SharedAccessSignature=sv=2015-04-05&sr=b&si=tutorial-policy-635959936145100803&sig=9aCzs76n0E7y5BpEi2GvsSv433BZa22leDOZXX%2BXXIU%3D

下面是具有 URL 编码的同一个连接字符串的示例:

BlobEndpoint=https://storagesample.blob.core.chinacloudapi.cn;
SharedAccessSignature=sv=2015-04-05&amp;sr=b&amp;si=tutorial-policy-635959936145100803&amp;sig=9aCzs76n0E7y5BpEi2GvsSv433BZa22leDOZXX%2BXXIU%3D

帐户 SAS 示例

下面是包含 Blob 和文件存储帐户 SAS 的连接字符串示例。 请注意,其中指定了两个服务的终结点:

BlobEndpoint=https://storagesample.blob.core.chinacloudapi.cn;
FileEndpoint=https://storagesample.file.core.chinacloudapi.cn;
SharedAccessSignature=sv=2015-07-08&sig=iCvQmdZngZNW%2F4vw43j6%2BVz6fndHF5LI639QJba4r8o%3D&spr=https&st=2016-04-12T03%3A24%3A31Z&se=2016-04-13T03%3A29%3A31Z&srt=s&ss=bf&sp=rwl

下面是具有 URL 编码的同一个连接字符串的示例:

BlobEndpoint=https://storagesample.blob.core.chinacloudapi.cn;
FileEndpoint=https://storagesample.file.core.chinacloudapi.cn;
SharedAccessSignature=sv=2015-07-08&amp;sig=iCvQmdZngZNW%2F4vw43j6%2BVz6fndHF5LI639QJba4r8o%3D&amp;spr=https&amp;st=2016-04-12T03%3A24%3A31Z&amp;se=2016-04-13T03%3A29%3A31Z&amp;srt=s&amp;ss=bf&amp;sp=rwl

为显式存储终结点创建连接字符串

可以在连接字符串中指定显式服务终结点,而不使用默认终结点。 若要创建指定显式终结点的连接字符串,请使用以下格式为每个服务指定完整的服务终结点,包括协议规范(HTTPS(建议)或 HTTP):

DefaultEndpointsProtocol=[http|https];
BlobEndpoint=myBlobEndpoint;
FileEndpoint=myFileEndpoint;
QueueEndpoint=myQueueEndpoint;
TableEndpoint=myTableEndpoint;
AccountName=myAccountName;
AccountKey=myAccountKey

如果已将 Blob 存储终结点映射到自定义域,可能需要指定显式终结点。 在这种情况下,可以在连接字符串中指定 Blob 存储的自定义终结点。 可以选择性指定其他服务的默认终结点(如果应用程序使用这些服务)。

下面是用于指定 Blob 服务的显式终结点的连接字符串的示例:

# Blob endpoint only
DefaultEndpointsProtocol=https;
BlobEndpoint=http://www.mydomain.com;
AccountName=storagesample;
AccountKey=<account-key>

此示例指定所有服务(包括 Blob 服务的自定义域)的显式终结点:

# All service endpoints
DefaultEndpointsProtocol=https;
BlobEndpoint=http://www.mydomain.com;
FileEndpoint=https://myaccount.file.core.chinacloudapi.cn;
QueueEndpoint=https://myaccount.queue.core.chinacloudapi.cn;
TableEndpoint=https://myaccount.table.core.chinacloudapi.cn;
AccountName=storagesample;
AccountKey=<account-key>

连接字符串中的终结点值用于构造存储服务的请求 URI,以及指示返回到代码的任何 URI 形式。

如果已将某个存储终结点映射到自定义域并在连接字符串中省略该终结点,则无法使用该连接字符串从代码访问该服务中的数据。

若要详细了解如何为 Azure 存储配置自定义域,请参阅将自定义域映射到 Azure Blob 存储终结点

重要

连接字符串中的服务终结点值必须是格式正确的 URI,包括 https://(推荐)或 http://

创建带有终结点后缀的连接字符串

若要针对具有不同终结点后缀的区域或实例内的存储服务创建连接字符串,例如针对由世纪互联运营的 Microsoft Azure 或 Azure 政府,请使用以下连接字符串格式。 指明是要通过 HTTPS(建议)还是 HTTP 连接到存储帐户,将 myAccountName 替换为存储帐户的名称,将 myAccountKey 替换为帐户访问密钥,将 mySuffix 替换为 URI 后缀:

DefaultEndpointsProtocol=[http|https];
AccountName=myAccountName;
AccountKey=myAccountKey;
EndpointSuffix=mySuffix;

下面是由世纪互联运营的 Azure 中的存储服务的示例连接字符串:

DefaultEndpointsProtocol=https;
AccountName=storagesample;
AccountKey=<account-key>;
EndpointSuffix=core.chinacloudapi.cn;

授权使用共享密钥访问

若要了解如何授权使用帐户密钥或连接字符串访问 Azure 存储,请参阅以下文章之一:

后续步骤