【问题标题】:Authorization in Event Hubs事件中心中的授权
【发布时间】:2015-02-05 12:33:56
【问题描述】:

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

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

请看下面的发布者代码sn-p:

        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);

【问题讨论】:

  • 请参阅stackoverflow.com/questions/28292330/… 了解将要共享分区的部分,除非您跳过箍。我自己没有使用 SAS 令牌,我只是猜测,但在 SAS 中使用受限发布者 URI (.servicebus.windows.net//publishers/) URI 可能会提供您需要的限制。从未使用过它,但文档对我暗示了这一点。

标签: azure azure-eventhub


【解决方案1】:

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

var connStr = ServiceBusConnectionStringBuilder.CreateUsingSharedAde...

然后有

CreateFromConnectionString(connectionString

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

记录并具有example 的内容是制作发布者特定的令牌并使用 HTTP 接口将事件发送到 EventHub。如果您检查生成的 SAS 令牌,您可以看到该令牌授予访问权限

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

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

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

交叉链接questions 很有用。

【讨论】:

  • 我很抱歉错字,但即使我使用 SAS 令牌,我仍然可以发布到其他分区。这似乎是 API 中的一个错误。
【解决方案2】:

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

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

【讨论】:

  • 当我使用 SAS 令牌时,我一定不能使用 CreatePartitionedSender 发布事件,但是当我尝试这样做时,我没有得到任何异常,并且通风口也发布到某个随机分区ID。相反,我期待 API 出现异常。现在,即使使用 SAS 令牌进行身份验证,恶意设备也有可能将事件发布到任何分区。
  • 嗨@Bussa.. 非常感谢您的评论。我明白了这个问题。现在已修复。您将无法再在特定于发布者的发件人上创建分区发件人。
【解决方案3】:

使用其当前的身份验证模型,您无法向发布者授予如此细粒度的访问权限。根据Event Hubs Authentication and Security Model Overview,目前不支持按分区进行身份验证。

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

【讨论】:

  • 你确定吗? stackoverflow.com/questions/28292330/…msdn.microsoft.com/en-us/library/azure/dn836025.aspx 另有建议。如果 CreatePartitionedSender 绕过发布者 SAS 限制,那么根据文档,这是一个错误。
  • @cacsar,请帮帮我,因为我很难理解您将如何将 SAS 限制为仅特定的 PartitionID?同样,如果您有更好的答案和工作示例,您可以在这里发布!什么会阻止发布者发布到另一个 PartitionID?更不用说,您参考的文档更进一步:It is a best practice for publishers to be unaware of partitions within the Event Hub
  • 再说一遍,同样的文档,你误读了Service Bus provides SAS policies at the namespace and *Event Hubs level*. 而不是at Event Hub Prition Level。最后但同样重要的是,同样的文档。提到Partitions are a data organization mechanism and are more related to downstream parallelism than to Event Hub throughput.
  • 问题来自 API 方法 CreatePartitionedSender,它会将事件发布到提供的 partitionId,而与通过 SAS 密钥进行身份验证时指定的 publisherID 无关。我唯一关心的是避免任何流氓设备发布到其他租户使用的分区。
  • 如果您仔细查看它在几个地方建议的文档,无论如何直接从发布者解决分区并不是一个好主意。因此,您的设计首先与 Microsoft 推荐的使用事件中心的最佳实践相冲突。是的,没有什么可以阻止任何发布者发布到任何分区。因为身份验证模型涵盖Event Hub 而不是Event Hub Partition
猜你喜欢
  • 2017-06-19
  • 2022-08-24
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
  • 2022-01-11
相关资源
最近更新 更多