如何在 Azure Blob 和队列存储中使用托管标识
介绍
Azure Blob 和队列存储是一种低成本解决方案,用于大规模存储和访问非结构化数据。队列可轻松与托管标识集成,这很有吸引力,因为无需将连接字符串等机密复制到开发人员的计算机上或签入源代码管理中。在本指南中,您将了解如何使用托管标识将 .NET 应用服务连接到 Azure Blob 存储和 Azure 队列存储。
托管标识
在 Azure 中,托管标识允许 Azure 资源在 Azure Active Directory (AD) 中自动为其创建标识。这样,这些资源就可以使用 Azure AD 身份验证向其他受保护的 Azure 资源(例如存储帐户)标识自己。本指南将介绍如何将托管标识与 Azure 应用服务结合使用。
Azure 应用服务支持用户分配的托管标识和系统分配的托管标识。 Azure App Services supports both user-assigned and system-assigned managed identities. 存在一些差异:There are a few Differences:
- 系统分配的标识与 Azure 应用服务的生命周期相关联。这意味着当您删除应用服务时,其托管标识也会被删除。只有特定的应用服务才能将自己标识为特定的用户身份。这意味着每个部署槽都会收到自己的系统分配的标识。
- 用户分配的标识是出现在资源组中的单独资源。同一个用户分配的标识可以分配给多个资源。如果你希望应用服务上的所有部署槽都具有相同的标识以减少角色分配的数量,那么这很有用。
将托管标识与 Azure 存储 Blob 结合使用
要开始使用 Azure App Service 托管标识,请创建一个新项目并安装一些包。
微软最新的软件包让您能够以最少的代码轻松完成此操作。在命令提示符中运行以下命令:
mkdir PLStorageManagedIdentity
cd PLStorageManagedIdentity
dotnet new mvc
dotnet add package Azure.Storage.Blobs
dotnet add package Azure.Identity
dotnet add package Microsoft.Extensions.Azure
上面的代码创建了一个新的 MVC 项目并安装了Azure.Storage.Blobs、Azure.Identity和Microsoft.Extensions.Azure。Azure.Identity是一个通用包,允许您获取令牌以使用不同的受保护 Azure 资源进行授权。
然后更新您的Startup.cs文件以注册 Blob 服务以进行依赖注入。
// Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddAzureClients(cfg =>
{
cfg.AddBlobServiceClient(Configuration.GetSection("Blobs")).WithCredential(new Azure.Identity.DefaultAzureCredential());
});
}
上述代码将查看您的配置(例如AppSettings.json ),以确定要连接哪个 Azure 存储 Blob 帐户。如果它在您的开发计算机上运行,它将使用 Visual Studio 或 Azure CLI 尝试进行身份验证。在 Azure 应用服务中运行时,它将使用上面讨论的用户分配标识。
要配置 Azure 存储 Blob 帐户,您可以将AppSettings.json更新为以下内容:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"Blobs": {
"ServiceUri": "https://xxxxxxxx.blob.core.windows.net/"
}
}
请注意,不需要任何诸如连接字符串或密码之类的机密信息。您还需要确保您的身份具有 Azure 存储 Blob 帐户的正确角色。如果您需要读写访问权限,请分配存储Blob 数据贡献者内置角色。
最后,要使用新注册的 Blob 服务,请使用以下内容更新HomeController.cs :
public HomeController(ILogger<HomeController> logger, BlobServiceClient blobServiceClient)
{
_logger = logger;
_blobContainerClient = blobServiceClient.GetBlobContainerClient("artifacts");
}
private readonly BlobContainerClient _blobContainerClient;
public IActionResult Blob()
{
var result = new { exists = _blobContainerClient.Exists() };
return Json(result);
}
正确设置角色后,您现在可以读取和写入 blob 容器。队列存储和文件存储服务也可以通过类似的方式进行身份验证。
连接到多个存储帐户
到目前为止,上述代码仅连接到一个存储帐户。 Azure SDK 还可以轻松连接到多个存储帐户。
services.AddAzureClients(cfg =>
{
cfg.AddBlobServiceClient(Configuration.GetSection("Blobs")).WithCredential(new Azure.Identity.DefaultAzureCredential());
cfg.AddBlobServiceClient(Configuration.GetSection("Inputs")).WithName("Inputs").WithCredential(new Azure.Identity.DefaultAzureCredential());
});
您已创建命名注册和默认注册。它们在AppSettings.json文件中单独配置。
{
"Blobs": {
"ServiceUri": "https://xxxxxxxx.blob.core.windows.net/"
},
"Inputs": {
"ServiceUri": "https://yyyyyyyy.blob.core.windows.net/"
}
}
有两个单独的ServiceUri集。有两个配置部分,一个名为Blob,一个名为Inputs。
要在其余代码中访问它们,您需要使用IAzureClientFactory。
public HomeController(
ILogger<HomeController> logger,
IAzureClientFactory<BlobServiceClient> clientFactory,
BlobServiceClient blobServiceClient)
{
_logger = logger;
var client2 = clientFactory.CreateClient("Inputs");
_blobContainerClient = blobServiceClient.GetBlobContainerClient("artifacts");
}
如果要访问默认 Azure 存储 Blob 帐户,可以直接将BlobServiceClient注入到构造函数中。如果要访问命名注册,则需要注入IAzureClientFactory<T>并调用其CreateClient("Inputs")方法。这类似于使用HttpClientFactory。
结论
Microsoft Azure 拥有越来越多的支持 Azure 资源托管标识的服务。使用此功能可以增强应用程序的安全性,因为您无需亲自管理机密。要掌握这些技能,请阅读如何定义 Azure 基于角色的访问控制 (RBAC)。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~