Chrome Webauthn - allowCredentials和凭据选择

jm81lzqq  于 2023-06-03  发布在  Go
关注(0)|答案(1)|浏览(199)

我正在实现Webauthn,其中基于浏览器的客户机使用Webauthn4J与Java后端通信。在后端,我在注册用户和链接到该用户的凭据之间建立了关联。对于身份验证流,我使用链接到活动用户的凭据填充allowCredentials数组。
为了解释这个问题,假设user1链接了3个凭证c1、c2和c3。我在Chrome(v113.0.5672.126,macOS Ventura 13.3.1)上看到的是,从allowCredentials列表中选择单个凭据,并提示用户验证该凭据。凭据的选择方式似乎不是确定性的,它不是最新的或最旧的,并且与allowCredentials数组中列出的凭据顺序无关(根据我的理解)。如果我从Chrome的密钥中删除该凭据,则会从列表中选择一个不同的凭据,但同样,只有一个凭据被提供用于身份验证。
如果我删除allowCredentials列表,则会提示用户使用所有3个凭据进行身份验证,因为所有3个凭据的作用域都在域中。当使用allowCredentials时,我会期待类似的行为,包括所有3个凭据。
我已经使用Webauthn debugger验证了这种行为,所以它似乎不是我这边的实现问题。
规范规定:“* 列表按优先级降序排列:列表中的第一项是最首选的凭据,最后一项是最不首选的凭据。*”
这不是我在实践中看到的。既不遵守顺序,也不包括所有凭据在提示中。
我是不是误解了allowCredentials应该是如何工作的,还是这是Chrome实现Webauthn的一个怪癖?

kx5bkwkv

kx5bkwkv1#

此问题可能与您尝试在同一设备上为同一用户为同一应用/网站生成的凭据数量有关。虽然应该允许用户拥有多个密钥来访问一个帐户,但理想情况下,他们应该在设备上的每个应用程序中只拥有一个密钥(我使用的术语设备可以是认证器或提供商,如Google/Apple)。

  • 鼓励:用户A可以在设备A和设备B上拥有他们的App 1密钥
  • 鼓励:设备A可以具有用户A和用户B的App 1密钥
  • 沮丧:设备A具有应用程序1的多个用户A密钥

您应该利用excludeCredentials列表来防止客户端应用程序出现这种情况。如果用户尝试在已有密钥的设备上创建新密钥,则应抛出错误/警报。
关于使用allowCredentials列表的第二个问题,不允许您在填充时选择密钥。我对这一点的理解是模糊的,但据我所知;当allowCredentials列表中填充了credentialID时,客户端(在本例中为Chrome)将尝试查找该特定凭据(无论它是Chrome的密钥的一部分,还是来自外部验证器(如安全密钥))。如果找到与credentialID匹配的凭据,Chrome将立即提示它。总的来说,这不是一个问题,因为你的应用只是在寻找任何符合条件的密钥,你选择的是哪一个并不重要。
如果您没有提供allowCredentials列表,Chrome将无法知道您正在查找的特定凭据。在这种情况下,浏览器将提示您选择要使用的特定凭据(密钥),因为浏览器从未提示过。
希望这能帮上忙。

相关问题