【问题标题】:Azure Service Bus - Topic - Message Attribute Based Access ControlAzure 服务总线 - 主题 - 基于消息属性的访问控制
【发布时间】:2022-08-04 03:21:49
【问题描述】:
我有一个 Azure 服务总线主题。发送到主题的消息包含应用程序属性。
我想根据一个或多个应用程序属性的值设置该主题的权限,即仅当身份 A 发送具有属性的消息时,例如Destination = \'service\' 允许将消息添加到主题中。
这背后的原因:假设一个主题有多个发布者和多个订阅者来消费来自发布者的消息。但是每条消息只能使用过滤器发送给特定的消费者。一个怀有恶意或偶然的演员可能会选择一个过滤器值并将消息发送给错误的消费者。而且我不想创建多个主题。我想通过在某个主题上通过具有某些值的消息属性限制他们的权限来限制发布者向某些消费者发送消息。
这可能吗?如果是,如何?
标签:
azure
permissions
azureservicebus
azure-servicebus-topics
azure-rbac
【解决方案1】:
- 您可以启动一个单独的应用程序来查看队列中的消息
检查属性,然后放弃消息。
- 要查看创建接收器并使用
receiver.ReceiveMessageAsync();
偷看消息。在此之后,您可以应用您的逻辑来过滤
使用属性的消息。
之后使用AbandonAsync 放弃属性错误的消息。
// create a reciever and peek the messages.
await using var client = new ServiceBusClient(connectionString);
//reciever
ServiceBusReceiver receiver = client.CreateReceiver(queueName) ;
// get the messages
ServiceBusReceivedMessage receivedMessage = await receiver.ReceiveMessageAsync();
// write you logic for filtering the message
//now we can abandon the message. Here "reason":" Wrong message" is optional
await receivedMessage.AbandonAsync(new Dictionary<string, object> { { "Reason", "wrong properties"} });
参考:请参阅 sfeldman 的 article
Peek messages
【解决方案2】:
您不能按照您描述的方式使用 ServiceBus(或任何消息代理)。
我的建议是仅将消息视为做某事的信号。但是该服务完全负责检查消息是否合法(例如通过同步调用源服务或另一个事实源)。
想象一下这个场景:
- SourceApp 发送 DeletedEvent{CustomerId="42"}。
- DestApp 收到此消息,并在删除与此客户相关的数据之前,对客户服务 GET CustomerService/42 进行 HTTP 调用。
- 如果客户被删除 => 完美
- 如果不是……出了什么问题,你描述的演员出于恶意或只是偶然
此外,如果您对许多应用程序使用相同的主题,请考虑使用 AAD 身份验证,每个应用程序使用托管标识。或者至少禁止共享 SAS 密钥。每个应用程序都应该有专用的连接字符串,范围为订阅或主题,只有所需的访问权限。