我目前正在研究基于Web身份验证的身份验证流程.我有一个yubikey 5设备来测试它.

对于认证仪式,我使用以下设置:

  • allowCreditures:[](空数组,因为我想使用可重写的凭据)
  • userVerification:不鼓励(为了尽量减少对用户交互流的干扰)

我看到的是,当使用Chrome与这些设置时,设备PIN总是被请求给用户.这在Firefox中是不同的.在这种情况下,PIN is not被请求给用户.

这可以很容易地复制在这个演示网站:https://webauthn.io/

有人知道为什么两个浏览器之间的行为不同吗?这可能是Chrome中的bug吗?

先谢谢你.

注:测试版本:

  • Chrome123.0.6312.86(OffimalBuild)(64位)
  • Firefox 124.0(64位)

推荐答案

更新

所以最初的答案是正确的,这是如何工作的,但我忘记了一部分,因为我做的大部分是CTAP而不是WebAuthn.虽然WebAuthn根本没有涵盖CredProtect,但MDMAPI实现通过扩展,更具体地说是credentialProtectionPolicy.

这将允许您手动将credProtect设置为请求的级别1,这将允许您使用该凭据来执行没有userVerification的断言.

当你用JavaScript标记了问题时,我假设你正在做这个直到navigator.credentials.create(options),然后请求将需要包括

extensions: {
  credentialProtectionPolicy: "userVerificationOptional"
}

在选项对象内.然后,Chrome将尊重CredProtect级别并将其设置为1,同时根据通常的请求将RK设置为true.这是不可能在www.example.com上进行测试,但你可以在Auth0's test implementation上进行测试

原始应答

Chrome实现Webauthn的方式与Firefox实现Webauthn的方式有细微的差别.

{
  1 => <Buffer 34 9d 9d c8 ef 9a c9 36 b3 3c dd f9 54 aa 57 b4 b1 f0 52 dd c5 7f 86 2e 37 9e ff b4 57 f7 48 57>,
  2 => {
    id: 'webauthn.io',
    name: 'webauthn.io'
  },
  3 => {
    displayName: 'abcde',
    id: <Buffer 58 4c 54 67 73 77 4e 6a 37 34 5f 49 62 4d 75 68 67 47 74 43 5a 4c 6f 67 55 48 50 72 63 4d 49 4c 51 45 72 78 77 73 64 37 35 48 51>,
    name: 'abcde'
  },
  4 => [
    {
      alg: -7,
      type: 'public-key'
    },
    {
      alg: -257,
      type: 'public-key'
    }
  ],
  7 => {
    rk: true
  },
  8 => <Buffer c3 3b a4 9b 74 06 ae e8 76 df 66 a7 57 4e 6b 00 a9 a2 00 e4 ce 40 a4 d4 89 40 06 92 bd a2 80 10>,
  9 => 2
}

如图所示,这个请求包含了您所期望的,请求本身有rk = true个,这将在设备上创建一个可删除的凭证.请求有一个令牌,但这只会影响我们的创建,而不会影响后来的断言.

如果我在Chrome中提出同样的请求,我会得到以下请求:

{
  1 => <Buffer b9 da 62 ad 82 89 4d 87 c8 8c b2 e0 a2 2d 74 23 ef a2 af 04 a9 16 06 76 d6 c4 13 c0 08 04 fa 19>,
  2 => {
    id: 'webauthn.io',
    name: 'webauthn.io'
  },
  3 => {
    displayName: 'Testsetesrsdr',
    id: <Buffer 45 37 4b 4c 76 50 48 59 46 4d 42 7a 5a 5a 75 48 6f 6d 31 4f 65 6f 43 33 68 41 5f 70 44 68 73 57 56 53 45 48 32 41 39 57 71 79 4d>,
    name: 'Testsetesrsdr'
  },
  4 => [
    {
      alg: -7,
      type: 'public-key'
    },
    {
      alg: -257,
      type: 'public-key'
    }
  ],
  6 => {
    credProtect: 2
  },
  7 => {
    rk: true
  },
  8 => <Buffer 1d df 5a dc 36 8b 59 92 95 dd 07 32 c5 8b 1d e8 64 57 c1 e2 b0 67 54 22 b1 7b 50 24 b3 4d 3f 05>,
  9 => 2
}

几乎相同的请求,rk在这里也是真的,但有一个关键的区别.Chrome为key 6添加了一个值,即credProtect: 2.在CTAP中,CredProtection Level 2被定义为userVerificationOptionalWithCredentialIDList,这意味着密钥只能通过某种用户验证(在您的情况下,PIN)或通过将其包含在allowList中才可被解密.More info on CredProtect

我强烈怀疑这是Chrome中的一个bug,但实际上Chrome已经决定将其作为其实现的一部分.Webauthn本身几乎没有覆盖任何关于CredProtect的内容,所以这个决定也不会影响他们对规范的一致性.

如果这是正确的方式,Chrome将变得非常基于意见,并且它不一定是正确的方式,因为向请求提供allowList会带来很多隐私问题,其中许多问题都在webAuthn中涵盖,特别是第14.6.3章.

所以,除非Chrome改变,我对此表示怀疑,否则你唯一的 Select 就是维护和供应allowList或举办UserVerification仪式.然而,通过Firefox生成的密钥可能没有任何一个,因为CTAP中的CredProtect默认值是1.它可以在Chrome或Firefox上获得.

Javascript相关问答推荐

橡皮擦完全让画布变成白色

如何从对象嵌套数组的第二级对象中过滤出键

在JS中获取名字和姓氏的首字母

如何才能拥有在jQuery终端中执行命令的链接?

为什么ngModel不能在最后一个版本的Angular 17上工作?'

给定一个凸多边形作为一组边,如何根据到最近边的距离填充里面的区域

手机上的渲染错误文本必须在文本组件中渲染,但在浏览器上没有问题<><>

使用领域Web SDK的Vite+Vue应用程序中的Web程序集(WASM)错误

类构造函数不能在没有用With Router包装的情况下调用

如何在ASP.NET项目中使用Google Chart API JavaScript将二次轴线值格式化为百分比

检索相加到点的子项

Angular 形式,从DOM中删除不会删除指定索引处的内容,但会删除最后一项

Reaction Redux&Quot;在派单错误中检测到状态Mutations

JavaScript不重定向配置的PATH

一个实体一刀VS每个实体多刀S

如何找到带有特定文本和测试ID的div?

更改agGRID/Reaction中的单元格格式

如何从Reaction-Redux中来自API调用的数据中筛选值

用内嵌的含selenium的Java脚本抓取网站

CSS网格使页面自动滚动