事件中心的授权

时间:2015-02-05 12:33:57

标签: azure azure-eventhub

我在事件中心发布商代码中使用SAS令牌身份验证以及设备ID(或发布商ID)。但我发现可以通过使用" CreatePartitionedSender"将事件发送到任何分区ID。客户端,即使我已使用设备ID进行身份验证。而我不希望两个不同的设备-Ids在同一分区中发布事件。我们是否可以添加一些自定义" 授权"代码以及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);

3 个答案:

答案 0 :(得分:0)

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

var connStr = ServiceBusConnectionStringBuilder.CreateUsingSharedAde...

然后有

CreateFromConnectionString(connectionString

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

记录的内容以及example使发布者特定令牌并使用HTTP接口向EventHub发送事件。如果检查生成的SAS令牌,您可以看到令牌授予对

的访问权限
[namespace].servicebus.windows.net/[eventhubname]/publishers/[publisherId]

这与安全模型上的documentation以及overview中发布商政策的一般讨论一致。我希望在publisherId上保证 - >使用此接口保持PartitionKey。因此,每个publisherId的事件都会以一致的分区结束。

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

交叉链接questions非常有用。

答案 1 :(得分:0)

有关Event Hubs发布商政策的完整说明,请参阅this blog

简而言之,如果您想要发布商政策 - 您将无法获得分区发件人。发布者策略是SAS安全模型的扩展,旨在支持非常多的发件人(在事件中心上达到数百万发件人的规模)。

答案 2 :(得分:-1)

使用当前的身份验证模型,您无法向发布者授予如此细粒度的访问权限。根据{{​​3}},目前不支持每个分区的身份验证。

你必须要么'#34;信任"您的出版商,或考虑不同的租户计划 - 即每个租户的事件中心。