Авторизация в концентраторах событий

Я использую аутентификацию токена SAS вместе с идентификатором устройства (или идентификатором издателя) в моем коде издателя концентратора событий. Но я вижу, что можно отправить событие на любой идентификатор раздела с помощью клиента CreatePartitionedSender, даже если я прошел аутентификацию с использованием идентификатора устройства. Принимая во внимание, что я не хочу, чтобы два разных события публикации идентификаторов устройств в одном разделе. Возможно ли, что мы можем добавить некоторый пользовательский код «авторизации вместе с аутентификацией SAS, чтобы разрешить ограниченный доступ к разделу для любого устройства.

Идея добавления авторизации к комбинации устройства и идентификатора раздела заключалась в том, чтобы разместить один концентратор событий для нескольких клиентов. Пожалуйста, сообщите, если я чего-то упускаю.

См. Ниже фрагмент кода для издателя:

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

person bussa    schedule 05.02.2015    source источник
comment
См. stackoverflow.com/questions/28292330/ для той части, где разделы будут совместно использоваться, если вы не перепрыгнете через обручи. Я сам не использовал токены SAS, я только предполагаю, но использую ограниченный URI издателя (‹мое пространство имен› .servicebus.windows.net / ‹имя концентратора событий› / publishers / ‹мое имя издателя›) в SAS URI может предоставлять необходимое ограничение. Никогда не использовал его, но документы подразумевают это для меня.   -  person cacsar    schedule 06.02.2015


Ответы (3)


Я замечаю в вашем примере кода, что у вас есть

var connStr = ServiceBusConnectionStringBuilder.CreateUsingSharedAde...

а затем иметь

CreateFromConnectionString(connectionString

Это говорит о том, что вы могли использовать строку подключения, содержащую ключ отправки, который вы использовали для создания токена, а не токен ограниченного доступа. В моих собственных тестах мне не удалось подключиться к EventHub с помощью EventHubClient, который устанавливает соединение AMQP, с токеном, специфичным для издателя. Это не означает, что он не поддерживается, просто у меня были ошибки, которые имели смысл, и возможность сделать это не кажется подлежащей документированию.

То, что задокументировано и содержит пример, делает конкретного издателя токены и отправка событий в EventHub через HTTP-интерфейс. Если вы изучите сгенерированный токен SAS, вы увидите, что токен предоставляет доступ к

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

Это соответствует документации по модели безопасности и общее обсуждение политик издателя в обзоре. Я ожидаю, что гарантия на publisherId -> PartitionKey будет сохраняться с этим интерфейсом. Таким образом, события каждого publisherId будут помещаться в согласованный раздел.

Это может быть не идеально для вашей многопользовательской системы, но код для отправки сообщений, возможно, проще и лучше подходит для предполагаемого варианта использования ключей для каждого устройства. Как обсуждалось в этом вопросе, вам нужно будет ответить что-то довольно грязное, чтобы каждый издатель получил свой собственный раздел, и вы выйдете за пределы разработанных вариантов использования.

Перекрестная ссылка вопросы могут быть полезны.

person cacsar    schedule 07.02.2015
comment
Прошу прощения за опечатку, но я все еще могу публиковать на других разделах, даже если использую токен SAS. Похоже на ошибку в API. - person bussa; 11.02.2015

Полное объяснение политики издателя концентраторов событий см. В этом блоге < / а>.

Короче говоря, если вам нужна политика издателя - вы не получите разделенного отправителя. Политика издателя - это расширение модели безопасности SAS, предназначенное для поддержки очень большого числа отправителей (до миллиона отправителей в концентраторе событий).

person Sreeram Garlapati    schedule 10.02.2015
comment
когда я использую токен SAS, я не могу публиковать события с помощью CreatePartitionedSender, но когда я пытаюсь это сделать, я не получаю никаких исключений, а также выпуск публикуется для некоторого случайного идентификатора раздела. Вместо этого я ожидал исключения от API. Теперь есть вероятность, что несанкционированное устройство может публиковать события в любом разделе, даже если оно аутентифицировано с помощью SAS Token. - person bussa; 11.02.2015
comment
Привет @Bussa .. Большое спасибо за ваш комментарий. Я понял проблему. Сейчас это исправлено. Вы больше не сможете создать разделенного отправителя для отправителя, определенного издателем. - person Sreeram Garlapati; 11.03.2015

С нынешней моделью аутентификации вы не можете предоставить издателям столь детальный доступ. В соответствии с аутентификация концентраторов событий и обзор модели безопасности < / а>.

Вы должны либо «доверять» своим издателям, либо думать о другой схеме арендатора, то есть концентраторах событий на каждого арендатора.

person astaykov    schedule 05.02.2015
comment
Вы уверены в этом? stackoverflow .com / questions / 28292330 / и msdn.microsoft. com / en-us / library / azure / dn836025.aspx предполагаем иное. Если CreatePartitionedSender обходит ограничения SAS издателя, то согласно документации это ошибка. - person cacsar; 06.02.2015
comment
@cacsar, пожалуйста, помогите мне, так как у меня проблемы с пониманием того, как именно вы ограничите SAS только определенным PartitionID? Опять же, если у вас есть лучший ответ и рабочий образец, вы можете опубликовать его здесь! И что остановит издателя от публикации на другом PartitionID? Не говоря уже о том, что документация, на которую вы ссылаетесь, идет еще дальше: It is a best practice for publishers to be unaware of partitions within the Event Hub - person astaykov; 06.02.2015
comment
Более того, опять же в той же документации, которую вы неправильно прочитали, указано 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. - person astaykov; 06.02.2015
comment
Проблема исходит от метода API CreatePartitionedSender, который опубликует событие для предоставленного partitionId независимо от идентификатора publisherID, который был указан при аутентификации с помощью ключа SAS. Моя единственная забота - не допустить публикации какого-либо мошеннического устройства в разделе, используемом другим клиентом. - person bussa; 06.02.2015
comment
Если вы внимательно посмотрите на документацию, она предлагает несколько мест, что в любом случае не является хорошей идеей напрямую обращаться к разделу от издателя. Таким образом, ваш дизайн в первую очередь противоречит тому, что Microsoft рекомендует в качестве наилучшей практики использования концентраторов событий. И да, ничто не может помешать любому издателю публиковать в любом разделе. Поскольку модель аутентификации охватывает Event Hub, а не Event Hub Partition. - person astaykov; 06.02.2015
comment
Единственный другой способ справиться с этой проблемой - использовать разные концентраторы событий для каждого клиента, что имеет обратную сторону - невозможность масштабировать коллектив моей системы для всех клиентов. Кроме того, мне нужно будет создать новую политику для каждого концентратора событий с разрешениями на отправку и прослушивание, и я понимаю, что политики ограничены для пространства имен служебной шины. Пожалуйста, поправьте меня, если я ошибаюсь. - person bussa; 06.02.2015
comment
или просто разрешить всем арендаторам отправлять сообщения в один и тот же концентратор событий и даже в одни и те же разделы. В любом случае вы контролируете процесс. И вы правы - существует ограничение на количество политик на пространство имен. Но ваш вопрос начинает выходить за рамки StackOverflow. - person astaykov; 06.02.2015
comment
В моем ответе вы обнаружите, что есть пример кода MS, который связывает посылки с определенного токена с определенным разделом. Другое дело получение. - person cacsar; 07.02.2015