使用 ADAL 检测到 multiple_matching_tokens_detected

Ste*_*hka 7 c# azure-active-directory 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); 
Run Code Online (Sandbox Code Playgroud)

为什么会发生此错误,解决该错误的“建议”解决方案是什么?我一直倾向于尝试通过获取这样的令牌来修复它,但真的很想知道错误到底是什么:

authContext.AcquireTokenSilent(mr.ResourceUri, credential, new UserIdentifier("usersUPN@foo.com", UserIdentifierType.UniqueId));
Run Code Online (Sandbox Code Playgroud)

jur*_*url 9

如果这仍然相关,我有类似的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. 享受。

像魔法一样为我工作


小智 2

此错误通常是准确的,如 - 它实际上报告不同用户的相同权限/资源/clientid 组合有多个令牌。您最终可能会得到此类令牌的原因有很多,事实上,在某些情况下它是完全合法的(例如,一个邮件应用程序同时支持多个用户的多个邮箱)。根据您的具体情况,我可以想到两个可能的罪魁祸首。一是 MyCustomTokenCache 可能不会强制 Web 会话之间的隔离,最终会汇集来自不同调用者的令牌。另一种可能性是,这两个用户的 UPN 可能已重新分配,现在您拥有多个包含旧 UPN 和新 UPN 的缓存条目。我建议检查缓存以查找此类重复项,如果存在,请相应地进行清理。