0

我在我的事件中心发布者代码中使用 SAS 令牌身份验证和设备 ID(或发布者 ID)。但是我发现即使我已经使用设备 ID 进行了身份验证,也可以使用“CreatePartitionedSender”客户端将事件发送到任何分区 ID。而我不希望在同一分区中发布两个不同的设备 ID 事件。我们是否可以添加一些自定义“授权”代码以及 SAS 身份验证,以允许对任何设备进行有限的分区访问。

向设备和分区 ID 组合添加授权背后的想法是为多个租户提供单个事件中心。如果我遗漏任何东西,请告知。

请参阅下面的发布者代码段:

        var publisherId = "1d8480fd-d1e7-48f9-9aa3-6e627bd38bae"; 
        string token = SharedAccessSignatureTokenProvider.GetPublisherSharedAccessSignature(
               new Uri("sb://anyhub-ns.servicebus.windows.net/"),
               eventHubName, publisherId, "send",
               sasKey,
               new TimeSpan(0, 5, 0));

           var factory = MessagingFactory.Create(ServiceBusEnvironment.CreateServiceUri("sb", "anyhub-ns", ""), new MessagingFactorySettings
           {
               TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(token),
               TransportType = TransportType.Amqp
           });

           var client = factory.CreateEventHubClient(String.Format("{0}/publishers/{1}", eventHubName, publisherId));

           var message = "Event  message for publisher: " + publisherId;

           Console.WriteLine(message);

           var eventData = new EventData(Encoding.UTF8.GetBytes(message));

           await client.SendAsync(eventData);

           await client.CreatePartitionedSender("5").SendAsync(eventData);

           await client.CreatePartitionedSender("6").SendAsync(eventData);
4

3 回答 3

0

我在您的示例代码中注意到您有

var connStr = ServiceBusConnectionStringBuilder.CreateUsingSharedAde...

然后有

CreateFromConnectionString(connectionString

这表明您可能使用了包含用于生成令牌的发送密钥的连接字符串,而不是受限访问令牌。在我自己的测试中,我没有设法使用 EventHubClient 连接到 EventHub,它使用发布者特定的令牌建立 AMQP 连接。这并不意味着不支持我得到有意义的错误,并且似乎没有记录这样做的能力

记录在案并有一个示例是制作发布者特定的令牌并使用 HTTP 接口将事件发送到 EventHub。如果您检查生成的 SAS 令牌,您可以看到该令牌授予对

[namespace].servicebus.windows.net/[eventhubname]/publishers/[publisherId]

这与有关安全模型的文档以及概述中对发布者策略的一般讨论一致。我希望对 publisherId -> PartitionKey 的保证与此接口保持一致。因此,每个publisherId 的事件最终都会出现在一致的分区中。

这对于您的多租户系统可能不太理想,但发送消息的代码可以说更简单,并且更适合每个设备密钥的预期用例。正如在这个问题中所讨论的,您需要做一些相当肮脏的事情来让每个发布者都有自己的分区,并且您将超出设计的用例。

交叉链接问题可能很有用。

于 2015-02-07T08:33:20.040 回答
0

有关事件中心发布者政策的完整说明,请参阅此博客

简而言之,如果您想要发布者策略 - 您将不会获得分区发件人。发布者策略是对 SAS 安全模型的扩展,旨在支持大量发送者(事件中心上的发送者数量达到百万)。

于 2015-02-10T04:53:07.120 回答
-1

使用其当前的身份验证模型,您无法授予发布者如此细粒度的访问权限。根据事件中心身份验证和安全模型概述,当前不支持按分区进行身份验证。

您必须“信任”您的发布者,或者考虑不同的租户方案——即每个租户的事件中心。

于 2015-02-05T20:53:11.253 回答