multiple_matching_tokens_detected с помощью ADAL

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

multiple_matching_tokens_detected: кеш содержит несколько токенов, удовлетворяющих требованиям. Вызовите AcquireToken еще раз, указав дополнительные требования (например, UserId).

Я понятия не имею, почему только у этих двух человек из сотен есть эта проблема, и они действительно не могут найти много об этом в сети. Наш код для получения токена выглядит так (упрощенно):

AuthenticationContext authContext = new AuthenticationContext(authority, new MyCustomTokenCache());
ClientCredential credential = new ClientCredential(myClientId, myPassword);
authContext.AcquireTokenSilent(resourceUri, credential, UserIdentifier.AnyUser); 

Почему возникает эта ошибка и каково «предлагаемое» решение ее устранения? Я склонялся к тому, чтобы попытаться исправить это путем получения такого токена, но действительно хотел бы знать, в чем на самом деле ошибка:

authContext.AcquireTokenSilent(mr.ResourceUri, credential, new UserIdentifier("[email protected]", UserIdentifierType.UniqueId));

person Steve Peschka    schedule 13.08.2015    source источник


Ответы (3)


Если это все еще актуально, у меня была аналогичная проблема с ошибкой multiple_matching_tokens_detected, и я обнаружил следующее:

https://developercommunity.visualstudio.com/content/problem/17315/cant-add-new-account-with-vsts-online-failed-to-re.html

Как упоминал Алекс в ответе (вам нужно сделать это на клиентской машине):

  1. Закройте все экземпляры Visual Studio (в вашем случае - я полагаю, закройте все клиентские приложения).
  2. Удалите% LOCALAPPDATA% \. IdentityService.
  3. Наслаждаться.

Работал для меня как по волшебству

person jurl    schedule 15.08.2018

Эта ошибка обычно точна, так как на самом деле она сообщает, что для одной и той же комбинации полномочий / ресурсов / клиентов существует несколько токенов для разных пользователей. Есть много возможных причин, по которым вы можете получить такие токены, и на самом деле есть сценарии, для которых это совершенно законно (скажем, одно почтовое приложение, которое поддерживает несколько почтовых ящиков для нескольких пользователей одновременно). В вашем конкретном случае я могу назвать двух возможных виновников. Во-первых, MyCustomTokenCache может не обеспечивать изоляцию между веб-сеансами, что приводит к объединению токенов от разных вызывающих. Другая возможность состоит в том, что у этих двух пользователей могло быть переназначено их UPN, и теперь у вас есть несколько записей кеша как со старым, так и со старым UPN. Я бы рекомендовал проверить кеш в поисках таких дубликатов и, если они есть, очистить соответствующим образом.

person vibronet    schedule 13.08.2015
comment
Хм, спасибо, Витторио, это интересно. Из-за того, как мы его используем, виновники, которые вы описываете, не будут задействованы, но я понимаю, что вы говорите, что может быть много возможных причин. Учитывая это, является ли последний вставленный мной фрагмент кода правильным способом попытаться решить проблему (заменив AnyUser конкретным UPN)? Или есть другие альтернативы, которые мне следует изучить? - person Steve Peschka; 14.08.2015
comment
Это правильный подход, но вы должны сопоставить правильный тип идентификатора с UserIdentifierType. если вы хотите передать значение UPN, вам необходимо передать UserIdentifierType.OptionalDisplayableId (если вы хотите, чтобы это было просто подсказкой) или RequiredDisplayableId (если вы хотите указать, что возвращаемый токен должен совпадать с идентификатором, который вы предоставляете). UniqueId используется с соответствующим значением непрозрачного идентификатора пользователя, которое вы найдете в UserInfo при получении AuthenticationResult. UniqueId предпочтительнее, поскольку его нельзя переназначить, но вам нужно где-то хранить его. - person vibronet; 14.08.2015

Решение для этого - перехватить сообщение об ошибке, и в случае, если ошибка multiple_matching_tokens_detected, затем запустить AuthenticationContext.TokenCache.Clear(); и попросить клиента повторить вход.

person lesyk    schedule 02.09.2020