Подход MassTransit, когда затрагиваются темы Azure Service Bus и безопасность - PullRequest
1 голос
/ 07 марта 2020

Я реализую библиотеку для издателей и потребителей событий, чтобы общаться через Azure Service Bus, и я думаю, что MassTransit может быть хорошим вариантом.

Я могу работать, публикуя sh несколько событий с и несколько потребителей получат их без каких-либо проблем, если я позволю MassTransit создавать те темы, которые ему нужны, и указав для потребителя только конечную точку получателя для 3 типов событий, в которых я указываю имя очереди.

Пример потребителя :

var busControl =
    Bus.Factory.CreateUsingAzureServiceBus(
        cfg =>
        {
            CreateAzureServiceBusHost(cfg, serviceBusUri, serviceBusKeyName, serviceBusKey);

            cfg.ReceiveEndpoint(queueName, endpoint =>
            {
                foreach (var eventDtoType in eventsTypes)
                {
                    var adapterType = typeof(EventHandlerAdapter<>).MakeGenericType(eventDtoType);
                    var resolvedType = sp.GetService(adapterType);
                    endpoint.Consumer(adapterType, type => resolvedType);
                }
            });
        });

Обратите внимание, что я указываю в качестве потребителя EventHandlerAdapterType<TEvent>, потому что у меня есть адаптер для абстрагирования обработчиков событий от MassTransit. Но это не имеет значения для этого вопроса.

Издатель настроен следующим образом:

var busControl =
    Bus.Factory.CreateUsingAzureServiceBus(
        cfg =>
        {
            CreateAzureServiceBusHost(cfg, serviceBusUri, serviceBusKeyName, serviceBusKey);
        });

Проблема заключается в том, что мне нужно использовать эту библиотеку, интегрированную с системой, которая создает ее собственные темы, и в нем есть защита ( только некоторые приложения могут публиковать sh, только определенные приложения могут читать сообщения, опубликованные в этой топи c)

Мне нужно создать токен sas для издателя, который хочет опубликовать sh события по определенным темам, и для потребителей, которые хотят читать из определенных тем . Однако создание токена выходит за рамки этого вопроса.

МОЕ РЕШЕНИЕ РЕШЕНИЯ : Я готовлю следующий сценарий в Azure Шина обслуживания: - Создать топи c topic-attempt-one (включенный раздел, хотя не уверен, если это уместно) - Создайте подписку subscription-attempt-one внутри этого topic-attempt-one - Создайте политику общего доступа в topi c SamplePublishOnly с разрешениями только для отправки - Создайте политику общего доступа в topi c SampleReadOnly с правами только для прослушивания

Я изменяю свой пример, чтобы издатель использовал ключ и keyName согласно SamplePublishOnly, а два потребителя использовали ключ и keyName согласно SampleReadOnly

На издателе я настраиваю его на использование одинаковых топиков c для 3 различных событий.

var busControl =
    Bus.Factory.CreateUsingAzureServiceBus(
        cfg =>
        {
            CreateAzureServiceBusHost(cfg, serviceBusUri, serviceBusKeyName, serviceBusKey);
            // Here I add the same topic name for the 3 event types I want to publish.
            cfg.Message<IEventOne>(topology =>
            {
                topology.SetEntityName("topic-attempt-one");
            });
            cfg.Message<IEventTwo>(topology =>
            {
                topology.SetEntityName("topic-attempt-one");
            });
            cfg.Message<IEventThree>(topology =>
            {
                topology.SetEntityName("topic-attempt-one");
            });
        });

Потребитель, который я настраиваю с конечной точкой получения ( с одним именем очереди для одного потребителя и другим для потребителя два) для трех сообщений с добавлением указания именно topi c и используемой подписки.

var busControl =
    Bus.Factory.CreateUsingAzureServiceBus(
        cfg =>
        {
            CreateAzureServiceBusHost(cfg, serviceBusUri, serviceBusKeyName, serviceBusKey);

            cfg.ReceiveEndpoint(queueName, endpoint =>
            {
                //I specify the topic and subscription name that is already created in ServiceBus
                endpoint.Subscribe("topic-attempt-one", "subscription-attempt-one");
                foreach (var eventDtoType in eventsTypes)
                {
                    var adapterType = typeof(EventHandlerAdapter<>).MakeGenericType(eventDtoType);
                    var resolvedType = sp.GetService(adapterType);
                    endpoint.Consumer(adapterType, type => resolvedType);
                }
            });
        });

var busControlWrapper = new BusControlWrapper(busControl);
return busControlWrapper;

Минусы Умерс не может сейчас запустить автобус. Думаю, есть проблема с правами доступа:

Microsoft.Azure.ServiceBus.UnauthorizedException: Manage,EntityRead claims required for this operation. TrackingId:2d6953d0-c8e1-4bdc-bed5-cc6e5d2d1f9e_G27, SystemTcker:sunnyatticsoftware.servicebus.windows.net:topic-attempt-one, Timestamp:2020-03-07T20:26:38

Хорошо, поэтому я решил создать две очереди вручную в Azure Service Bus для каждого потребителя, надеясь, что MassTransit может создавать виртуальные очереди, если это необходимо для разных сообщений. - Создайте queue-one - Создайте политику общего доступа с утверждениями только для Listen, и я называю ее QueueReadOnly и пытаюсь использовать ее keyName и key.

Ничего. Другая ошибка, но все еще не может заставить ее работать

 Microsoft.Azure.ServiceBus.UnauthorizedException: claim is empty. TrackingId:9e344a3f-d40a-475d-bf61-7aae274ed2d1_G17, SystemTracker:sunnyatticsoftware.servicebus.windows.net:topic-attempt-one, Timestamp:2020-03-07T20:40:33

, что имеет смысл, потому что я говорю ей использовать специфицированный c topi c и подписку, но не использовать токен с чтением разрешения на них, поскольку я заменил его на очередь.

ВОПРОСЫ

  • это правильный подход для моего сценария?
  • это нормально, чтобы попытаться поделиться одной и той же topi c для публикации 3 различных типов сообщений? Кажется, дизайн MassTransit заставляет меня использовать один topi c на сообщение.
  • как достичь того, что мне нужно? Как другие справляются с разрешениями, если я не хочу, чтобы издатель MassTransit и потребители использовали маркер полного разрешения Manage, потому что я не хочу, чтобы потребители, например, публиковали sh на топике c?

Спасибо!

PS: Я обнаружил похожую проблему, но, к сожалению, она не решает мою проблему. Как указать Azure Topi служебной шины c для использования с MassTransit

Обновление 1

Я нашел это: Возможно ли использовать MassTransit 3 с Azure Service Bus без политики разрешений Manage?

, что, если это все еще относится к последней версии 6.2, может объяснить, почему я получаю эти ошибки. Жаль, если я не могу использовать какие-либо претензии, кроме «Управление». Итак, нет гранулярных разрешений с Masstransit? Как можно запретить приложению, имеющему токен Manage, читать сообщения, которые он не должен читать? Если создание объектов, таких как темы, подписки или очереди, не вариант, возможно ли использовать Masstransit?

Я предполагаю, что мне не хватает знаний, поэтому любая ссылка также будет оценена!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...