C# 使用ADAL检测到多个匹配的令牌

C# 使用ADAL检测到多个匹配的令牌,c#,azure-active-directory,adal,C#,Azure Active Directory,Adal,我有一个使用Azure访问令牌的服务,我们使用ADAL检索这些令牌。我们有数百名客户,但由于某些原因,当我们尝试为他们检索AuthenticationResult时,其中有两名客户偶尔会产生此错误: 检测到多个匹配的令牌:缓存包含多个令牌 满足要求。再次调用AcquireToken提供更多 要求(例如用户ID) 我不知道为什么几百人中只有这两个人有这个问题,而且在网上找不到太多。我们获取令牌的代码如下所示(简化): 为什么会发生此错误?解决此错误的“建议”解决方案是什么?我一直倾向于通过获取这样

我有一个使用Azure访问令牌的服务,我们使用ADAL检索这些令牌。我们有数百名客户,但由于某些原因,当我们尝试为他们检索
AuthenticationResult
时,其中有两名客户偶尔会产生此错误:

检测到多个匹配的令牌:缓存包含多个令牌 满足要求。再次调用AcquireToken提供更多 要求(例如用户ID)

我不知道为什么几百人中只有这两个人有这个问题,而且在网上找不到太多。我们获取令牌的代码如下所示(简化):

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

authContext.AcquireTokenSilent(mr.ResourceUri, credential, new UserIdentifier("usersUPN@foo.com", UserIdentifierType.UniqueId));

此错误通常是准确的,如-它实际上报告了不同用户的同一权限/资源/客户端ID组合有多个令牌。有许多可能的原因导致您最终使用此类令牌,事实上,在某些情况下,它是完全合法的(例如一个邮件应用程序同时支持多个用户的多个邮箱)。在你的具体案件中,我能想到两个可能的罪犯。其中一个原因是MyCustomTokenCache可能不会在web会话之间强制隔离,从而导致来自不同调用方的令牌池。另一种可能性是,这两个用户可能已经重新分配了他们的UPN,现在您有多个缓存条目,其中既有旧的UPN,也有新的UPN。我建议检查缓存以查找此类重复项,如果存在,则相应地进行清理。

如果这仍然相关,则我在检测到多个匹配令牌时遇到类似问题。错误,我发现:

正如Alex在回答中提到的(您需要在客户端机器上执行此操作):

  • 关闭所有VisualStudio实例(在您的例子中,我想是关闭所有客户端应用程序)
  • 删除%LOCALAPPDATA%\.IdentityService
  • 享受

  • 对我来说像魔术一样有效

    解决方案是捕获错误消息,如果错误是
    检测到多个匹配的令牌
    ,则运行
    AuthenticationContext.TokenCache.Clear()并要求客户重复登录。

    嗯,谢谢Vittorio,这很有趣。就我们使用它的方式而言,你所描述的罪犯不会参与其中,但我理解你所说的可能有很多原因。考虑到这一点,我粘贴的最后一个代码段是否是尝试解决问题的“正确”方法(用特定的UPN替换AnyUser)?或者我还应该研究其他替代方法吗?这是正确的方法,但必须将正确的标识符类型与UserIdentifierType匹配。如果要传递UPN值,则需要传递UserIdentifierType.OptionalDisplayableId(如果希望这只是一个提示)或RequiredDisplayableId(如果希望强制要求返回的令牌必须与提供的标识符匹配)。UniqueId与获得AuthenticationResult时在UserInfo中找到的相应用户不透明标识符值一起使用。UniqueId更可取,因为它不可重新分配,但您确实需要将其存储在某个位置。
    authContext.AcquireTokenSilent(mr.ResourceUri, credential, new UserIdentifier("usersUPN@foo.com", UserIdentifierType.UniqueId));