Асинхронные служебные шинные операции Повышение тайм-аута Исключение вместо UnauthorizedAccessException с использованием ACS
Я использую службу контроля доступа для авторизации доступа к определенным подпискам на служебную шину для определенных идентификаторов службы.
При получении сеансов или сообщений из подписки идентификатор службы авторизируется и может получать и завершать или оставлять сообщения по мере необходимости.
Тем не менее, я не вижу UnauthorizedAccessException
при попытке получить доступ к подписке, к которой идентификатор службы не имеет доступа, и я не вижу этого исключения при попытке выполнить операцию, которую Группа правил не выдала для этой служебной идентификационной и доверяющей стороны (например, Отправить сообщение или создать тему).
Вместо этого я в конце концов вижу TimeoutException - "The timeout elapsed upon attempting to obtain a token while accessing 'https://namespace-sb.accesscontrol.windows.net/WRAPv0.9/'"
. Внутреннее исключение - SecurityTokenException - "The token provider was unable to provide a security token while accessing 'https://namespace-sb.accesscontrol.windows.net/WRAPv0.9/'. Token provider returned message: 'The operation has timed out'"
. Это вызывает проблему для RetryPolicy, поскольку исключение Timeout считается переходным.
Странно, однако, я получаю UnauthorizedAccessException
при попытке получить описание подписки. Что-то, что в соответствии с Права, необходимые для операций служебной шины, должно быть доступно для идентификаторов служб с помощью запроса на прослушивание в области... myTopic/Subscriptions/mySubscription.
У меня есть следующая настройка:
- Идентификатор службы: testidentity
- Группы правил:
- Заявка на подачу заявки:
Я вижу следующие проблемы:
var manager = NamespaceManager.CreateFromConnectionString("Endpoint=sb://namespace.servicebus.windows.net/;SharedSecretIssuer=testidentity;SharedSecretValue=SSdtIE5vdCBUZWxsaW5n=");
var description = manager.GetSubscription("myTopic","mySubscription");
Результаты в UnauthoriszedAccessException - "The remote server returned an error: (401) Unauthorized."
Я ожидаю, что вы сможете получить описание, а не получать это исключение. Интересно, что это единственная область, к которой имеет доступ идентификатор, и это единственный раз, когда я вижу исключение UnauthorizedAccessException.
var subscriptions = manager.GetSubscriptions("myTopic");
Результаты в TimeoutException
, с внутренним исключением типа SecurityTokenException
. Я ожидал бы UnauthorizedAccessException
здесь.
var client = SubscriptionClient.CreateFromConnectionString("Endpoint=sb://namespace.servicebus.windows.net/;SharedSecretIssuer=testidentity;SharedSecretValue=SSdtIE5vdCBUZWxsaW5n=", "myTopic", "otherSubscription");
var message = client.Receive()
Результаты в сообщении null
, но снова я ожидаю UnauthorizedAccessException
. Изучая вывод, я вижу исключения, происходящие в окне вывода, но проглатываемые клиентом:
A first chance exception of type 'System.Net.WebException' occurred in System.dll
A first chance exception of type 'Microsoft.ServiceBus.TokenProviderHelper.InternalSecurityTokenException' occurred in Microsoft.ServiceBus.dll
A first chance exception of type 'System.Net.WebException' occurred in System.dll
A first chance exception of type 'Microsoft.ServiceBus.TokenProviderHelper.InternalSecurityTokenException' occurred in Microsoft.ServiceBus.dll
A first chance exception of type 'System.Net.WebException' occurred in System.dll
A first chance exception of type 'System.Net.WebException' occurred in System.dll
A first chance exception of type 'Microsoft.ServiceBus.TokenProviderHelper.InternalSecurityTokenException' occurred in Microsoft.ServiceBus.dll
A first chance exception of type 'Microsoft.ServiceBus.TokenProviderHelper.InternalSecurityTokenException' occurred in Microsoft.ServiceBus.dll
A first chance exception of type 'System.Net.WebException' occurred in System.dll
A first chance exception of type 'Microsoft.ServiceBus.TokenProviderHelper.InternalSecurityTokenException' occurred in Microsoft.ServiceBus.dll
A first chance exception of type 'System.Net.WebException' occurred in System.dll
A first chance exception of type 'Microsoft.ServiceBus.TokenProviderHelper.InternalSecurityTokenException' occurred in Microsoft.ServiceBus.dll
A first chance exception of type 'System.Net.WebException' occurred in System.dll
A first chance exception of type 'Microsoft.ServiceBus.TokenProviderHelper.InternalSecurityTokenException' occurred in Microsoft.ServiceBus.dll
A first chance exception of type 'System.Net.WebException' occurred in System.dll
A first chance exception of type 'Microsoft.ServiceBus.TokenProviderHelper.InternalSecurityTokenException' occurred in Microsoft.ServiceBus.dll
A first chance exception of type 'System.Net.WebException' occurred in System.dll
A first chance exception of type 'Microsoft.ServiceBus.TokenProviderHelper.InternalSecurityTokenException' occurred in Microsoft.ServiceBus.dll
A first chance exception of type 'System.Net.WebException' occurred in System.dll
A first chance exception of type 'Microsoft.ServiceBus.TokenProviderHelper.InternalSecurityTokenException' occurred in Microsoft.ServiceBus.dll
A first chance exception of type 'System.Net.WebException' occurred in System.dll
A first chance exception of type 'Microsoft.ServiceBus.TokenProviderHelper.InternalSecurityTokenException' occurred in Microsoft.ServiceBus.dll
A first chance exception of type 'System.Net.WebException' occurred in System.dll
A first chance exception of type 'Microsoft.ServiceBus.TokenProviderHelper.InternalSecurityTokenException' occurred in Microsoft.ServiceBus.dll
A first chance exception of type 'System.Net.WebException' occurred in System.dll
A first chance exception of type 'Microsoft.ServiceBus.TokenProviderHelper.InternalSecurityTokenException' occurred in Microsoft.ServiceBus.dll
A first chance exception of type 'System.Net.WebException' occurred in System.dll
A first chance exception of type 'Microsoft.ServiceBus.TokenProviderHelper.InternalSecurityTokenException' occurred in Microsoft.ServiceBus.dll
A first chance exception of type 'System.Net.WebException' occurred in System.dll
A first chance exception of type 'Microsoft.ServiceBus.TokenProviderHelper.InternalSecurityTokenException' occurred in Microsoft.ServiceBus.dll
A first chance exception of type 'System.Net.WebException' occurred in System.dll
A first chance exception of type 'Microsoft.ServiceBus.TokenProviderHelper.InternalSecurityTokenException' occurred in Microsoft.ServiceBus.dll
A first chance exception of type 'System.Net.WebException' occurred in System.dll
A first chance exception of type 'Microsoft.ServiceBus.TokenProviderHelper.InternalSecurityTokenException' occurred in Microsoft.ServiceBus.dll
A first chance exception of type 'System.Net.WebException' occurred in System.dll
A first chance exception of type 'Microsoft.ServiceBus.TokenProviderHelper.InternalSecurityTokenException' occurred in Microsoft.ServiceBus.dll
A first chance exception of type 'System.TimeoutException' occurred in Microsoft.ServiceBus.dll
A first chance exception of type 'System.TimeoutException' occurred in Microsoft.ServiceBus.dll
A first chance exception of type 'System.TimeoutException' occurred in Microsoft.ServiceBus.dll
A first chance exception of type 'System.TimeoutException' occurred in Microsoft.ServiceBus.dll
Аналогично, попытка создания тем, отправки сообщений и т.д. также приводит к TimeoutException
.
Это правильное поведение при попытке получить доступ к областям, к которым идентификатор службы не имеет никакого доступа, а не к ожиданию получения UnauthorizedAccessException
?
Я думаю, что у установки есть желаемый результат: идентификаторы не могут прослушивать подписки, отличные от той, которая указана в области подписки, против которой идентификатор имеет правило Listen, но я обеспокоен тем, что обратная связь с ошибкой не ясно, и приведет к непрерывным повторениям.
Любые советы будут оценены наиболее высоко.
Ответы
Ответ 1
Новые пространства имен SB, созданные после 8/22 через портал Azure, больше не будут создавать пространства имен ACS-компаньона. Поэтому вполне возможно, что тайм-аут, который вы получаете, - это правильное поведение.
Чтобы сгенерировать пространство имен ACS, попробуйте создать пространство имен SB с помощью командлета PowerShell нового-azuresbnamespace.
Ответ 2
Некоторые из этих токенов имеют ограниченный срок службы/срок действия. Поэтому, если вы используете токен, который прошел его истечение, что может привести к ошибке авторизации, как вы переживаете.