我在事件中心发布商代码中使用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);
答案 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;信任"您的出版商,或考虑不同的租户计划 - 即每个租户的事件中心。