如何在 Azure 服务总线中使用托管标识
介绍
许多云应用程序依赖异步消息传递来提高可靠性并分离解决方案的不同部分。您可以使用 Azure 服务总线作为云消息传递服务来实现这些目标。Azure 服务总线的一大优势是它支持托管标识,这是一项 Microsoft Azure 功能,允许您的应用程序使用 Azure 服务总线进行身份验证或授权。其吸引力在于,无需将连接字符串等机密复制到开发人员的计算机上或签入源代码管理。
Microsoft 最近更新了其 Azure 服务总线 .NET SDK,以便更轻松地使用托管标识。在本指南中,您将了解如何使用托管标识将 .NET 应用服务连接到 Azure 服务总线。
使用角色设置托管标识
要开始使用应用服务托管标识和服务总线,您需要创建一些资源。
您可以使用 Azure CLI 轻松完成此操作:
rg=my-resource-group
webapp=my-app-name
erviceplan=my-sp
servicebus=demo-pl-service-bus
# create app service plan and app service
az appservice plan create --is-linux --sku f1 -g $rg -n $serviceplan
az webapp create -g $rg -p $serviceplan -n $webapp -r "dotnetcore|3.1"
az webapp identity assign -g $rg -n $webapp
APP_IDENTITY=$(az webapp identity show -n $webapp -g $rg --query "{principalId:principalId}" -o tsv)
# create service bus and queue
az servicebus namespace create --sku standard -g $rg -n $servicebus
queue_id=$(az servicebus queue create -n test --namespace-name $servicebus -g $rg -o tsv --query "{id:id}")
# assign roles to listen and send messages to the queue
az role assignment create --role "Azure Service Bus Data Receiver" --assignee $APP_IDENTITY --scope $queue_id
az role assignment create --role "Azure Service Bus Data Sender" --assignee $APP_IDENTITY --scope $queue_id
这些命令做三件事:
- 使用系统分配的标识创建应用服务计划和 Azure 应用服务
- 创建服务总线命名空间和队列
- 使用基于角色的访问控制 (RBAC) 授予新创建的应用服务的托管标识以接收和发送消息到测试队列
安装适用于 Azure 服务总线的 .NET SDK
微软有多个用于与 Azure Service Bus 交互的 .NET SDK。撰写本文时最新的 SDK 称为 Service Bus Track 2 Library,它有一个名为Azure.Messaging.ServiceBus的 NuGet 包。
此软件包目前处于预发布状态,并且最容易与托管身份集成。
要在 ASP.NET Core 应用程序中开始使用此包,请从项目运行以下命令:
dotnet add package Azure.Identity
dotnet add package Microsoft.Extensions.Azure
dotnet add package Azure.Messaging.ServiceBus --version 7.0.0-preview.8
更新您的代码
创建所有资源并分配角色后,您需要更新代码以使一切正常运行。
首先更新您的Startup.cs方法并注册一个新的HostedService来监听消息并注册ServiceBusClient。
services.AddHostedService<ServiceBusHostedService>();
services.AddAzureClients(cfg =>
{
cfg.AddServiceBusClient(Configuration.GetSection("ServiceBus")).WithCredential(new Azure.Identity.DefaultAzureCredential());
});
此代码从配置(例如AppSettings.json )中读取服务总线位置。如果您有多个环境并使用不同的服务总线命名空间(暂存和生产),这是理想的选择。
将以下配置添加到您的AppSettings.json。
{
"ServiceBus": {
"FullyQualifiedNamespace": "xxxxxxxx.servicebus.windows.net"
}
}
要实际监听消息,请创建ServiceBusHostedService类并添加以下代码:
public class ServiceBusHostedService : IHostedService
{
private readonly ServiceBusClient _serviceBusClient;
private ServiceBusProcessor _processor;
public ServiceBusHostedService(ServiceBusClient serviceBusClient)
{
_serviceBusClient = serviceBusClient;
}
public async Task StartAsync(CancellationToken cancellationToken)
{
_processor = _serviceBusClient.CreateProcessor("test");
_processor.ProcessMessageAsync += ProcessMessageAsync;
_processor.ProcessErrorAsync += ProcessErrorAsync;
await _processor.StartProcessingAsync(cancellationToken);
}
private Task ProcessErrorAsync(ProcessErrorEventArgs arg)
{
return Task.CompletedTask;
}
private Task ProcessMessageAsync(ProcessMessageEventArgs arg)
{
// perform your business logic to process messages
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
return _processor.CloseAsync(cancellationToken: cancellationToken);
}
}
您的代码现在正在使用 ASP.NET Core 中的 IHostedService在后台监听新的服务总线消息。
要发送消息,请注入ServiceBusClient类并调用CreateSender()方法。
public ServiceBusSender _serviceBusSender { get; private set; }
public HomeController(
ILogger<HomeController> logger,
ServiceBusClient serviceBusClient)
{
_logger = logger;
_serviceBusSender = serviceBusClient.CreateSender("test");
}
[HttpPost("post-message")]
public async Task<IActionResult> Message(MyModel model)
{
var message = new ServiceBusMessage(Azure.BinaryData.FromObjectAsync(model)));
await _serviceBusSender.SendMessageAsync(message);
return Accepted();
}
请注意,在所有代码示例中,都不需要连接字符串或客户端密钥。此授权由您处理。当您在本地开发计算机上工作时,可以使用 Azure CLI 凭据或 Visual Studio 凭据对这些受保护的资源进行授权。当应用运行 Azure 应用服务时,它使用托管标识进行身份验证。
结论
Azure 服务总线提供可靠的云消息传递即服务。如果您学习使用较新的 SDK,则可以使您的应用程序更安全并更快地开发功能。要了解有关 Azure 服务总线 .NET SDK 的最新开发的更多信息,请阅读Microsoft 的 GitHub 存储库的服务总线问题。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~