Webauthn - 允许凭证和凭证选择

问题描述 投票:0回答:2

我正在实现 Webauthn,其中基于浏览器的客户端使用 Webauthn4J 与 Java 后端进行通信。在后端,我在注册用户和链接到该用户的凭据之间建立了关联。对于身份验证流程,我使用链接到活动用户的凭据填充 allowCredentials 数组。

为了解释问题,假设 user1 有 3 个链接的凭据:c1、c2 和 c3。我在 Chrome(v113.0.5672.126、macOS Ventura 13.3.1)上看到的是,从 allowedCredentials 列表中选择一个凭据,并提示用户验证该凭据。选择凭证的方式似乎不是确定性的,它不是最新的或最旧的,并且与allowCredentials 数组中列出的凭证的顺序无关(根据我的理解)。如果我从 Chrome 的密钥中删除该凭据,则会从列表中选择不同的凭据,但同样,只会提供一个凭据进行身份验证。

如果我删除 allowedCredentials 列表,系统会提示用户提供所有 3 个凭据进行身份验证,因为所有 3 个凭据的范围都在域内。当使用包含所有 3 个凭据的allowCredentials 时,我期望类似的行为。

我已经使用 Webauthn 调试器验证了此行为,因此这似乎不是我这边的实现问题。

规范指出: “列表按优先级降序排列:列表中的第一项是最优先的凭证,最后一项是最不优先的凭证。

这不是我在实践中看到的。既不尊重该顺序,也不将所有凭据包含在提示中。

我是否误解了allowCredentials应该如何工作,或者这是Webauthn的Chrome实现的一个怪癖?

google-chrome webauthn
2个回答
0
投票

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

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

您应该利用

excludeCredentials
列表来防止客户端应用程序出现这种情况。对于尝试在已有密钥的设备上创建新密钥的用户,应抛出错误/警报。

关于使用

allowCredentials
列表的第二个问题,不允许您在填充时选择密钥。我对此的理解很模糊,但据我了解;当
credentialID
填充到
allowCredentials
列表中时,客户端(在本例中为 Chrome)将尝试查找该特定凭据(无论它是 Chrome 密钥的一部分还是来自安全密钥等外部身份验证器)。如果找到与
credentialID
匹配的凭据,Chrome 将立即提示输入。总的来说,这不是问题,因为您的应用程序只是寻找任何符合条件的密钥,您选择哪个并不一定重要。

如果您不提供

allowCredentials
列表,Chrome 就不知道您正在查找哪个特定凭据。在这种情况下,浏览器将提示您选择要使用的特定凭据(密码),因为浏览器从未提示过该凭据。

希望这有帮助。


0
投票

我写了一篇关于 WebAuthn 的大文章,你可以在这里找到它

让我分享一些引言:

allowCredentials – 这里值得考虑上下文。如果密钥存储在身份验证器设备上(请参阅 residentKey 属性),则 allowedCredentials 是可选的。但是,如果身份验证器不存储密钥和 credentialId,则 allowedCredentials 是必需的 - 否则,客户端将无法找到所需的身份验证数据。

大多数情况下只是给客户端的一种提示

为了改善授权过程中的用户体验,您还可以使用自动完成功能。输入和文本区域支持自动完成属性的用户名值,值为 webauthn。如果用户使用 autocomplete=”username webauthn” 与 input/textarea 进行交互,那么浏览器将在 onChange 事件中返回用户的用户名,为此我们应该获取 credentialId 并将其传递给 allowedCredentials 数组。

© www.soinside.com 2019 - 2024. All rights reserved.