LoginLess WebAuthn:将 WebAuthn 与 Windows Hello 或安全密钥结合使用时,无需输入用户名或密码

jaf*_*fkn 5 keycloak

我想使用 Keycloak 和 Windows Hello(或支持的安全密钥)实现真正的无登录(不是无密码)身份验证。这意味着我不想输入我的用户名或密码。(Keycloak 应该自动从我的安全密钥/Windows Hello 中提取用户名)

据我正确理解文档0,这应该可行。并非每个安全密钥都受支持(因为它必须能够在密钥本身上存储用户凭据),但应该支持 Windows Hello,请参阅1

为了使 WebAuthn 与 Windows Hello 配合使用,我添加了签名算法 RS256,如2中所述:

  • 身份验证 -> WebAuthn 无密码策略 -> 签名算法 -> ES256 和 RS256(使用 ctr-key 选择两者)

另外我设置了 userverification=yesresident key=yes, 3

  • 身份验证 -> WebAuthn 无密码策略 -> 需要常驻密钥 -> 是
  • 身份验证 -> WebAuthn 无密码策略 -> 用户验证要求 -> 必需

WebAuthn 无密码策略

与3中一样,我的身份验证流程现在仅包含一行:WebAuthn 无密码身份验证器,必需。

身份验证流程

我已经使用用户名、密码和安全密钥注册了一个用户(在更改身份验证流程之前)。

但是,当我将身份验证流程更改为无需登录的身份验证流程时,单击输入时会收到此错误消息:我们很抱歉...用户名或密码无效。

错误信息

谁能帮我?

此外,有没有一种方法可以在没有密码(即只有安全密钥)的情况下注册新用户?目前,切换到免登录身份验证流程后,我无法再注册新用户(因为我总是收到错误消息)。

我也在Keycloak Github上问了同样的问题

jaf*_*fkn 3

请注意我最后的附录!


原答案:

我部分地设法解决了我的问题。但仍有一些悬而未决的问题。以下是我的配置和步骤:

钥匙斗篷配置

  • 领域设置
    • 登录
      • 用户注册 -> 关闭
  • 验证
    • 流量
      • 创建了新的“自定义浏览器登录”
        • Cookie -> 替代方案
        • WebAuthn 无密码身份验证器 -> 替代方案
    • 绑定
      • 浏览器流程 ->“自定义浏览器登录”
    • 所需采取的行动
      • Webautn 无密码注册 -> 启用和默认操作
    • WebAuthn 无密码策略
      • 签名算法 -> ES256 & RS256
      • 需要居民钥匙 -> 是
      • 用户验证要求 -> 必需

注册用户包括。安全密钥

  • 笔记:
    • 注册只能由管理员在管理控制台中完成,即登录页面没有注册选项
    • 管理员必须为用户注册(第一个)安全密钥
  • 用户
    • 添加用户
      • 输入用户名:myuser1
      • 节省
      • 注意:自动添加所需的用户操作 -> Webauthn 注册无密码
    • 我的用户1
      • 模拟 -> 打开帐户控制台
  • 账户控制台
    • 单击登录
    • 注册 -> 注册新的安全密钥
  • 注意:由于某种原因,只有当我们在身份验证流程中激活了 Cookie 时,这才有效

添加安全密钥

  • 注意:可能用户丢失了安全密钥,或者需要添加一个额外的安全密钥
  • 用户
    • 我的用户1
      • 添加所需的用户操作 -> Webauthn 注册无密码
      • 节省
      • 模拟 -> 打开帐户控制台
  • 账户控制台
    • 单击登录
    • 注册 -> 注册新的安全密钥
  • 注意:由于某种原因,只有当我们在身份验证流程中激活了 Cookie 时,这才有效

登入

  • 打开应用程序,例如帐户控制台
    • 单击登录
    • 注意:登录的唯一选项是:“使用安全密钥登录”
    • 点击“使用安全密钥登录”
    • 如果是带 PIN 码的 Windows Hello:单击“确定”并输入 PIN 码
    • 注意:因为我们在身份验证流程中激活了 Cookie,所以用户必须手动注销(至少只要 Cookie 有效)

开放性问题:

  • 为什么我必须激活 Cookie 才能进行冒充?
  • 有没有办法添加安全密钥而不冒充?请注意,我没有设置任何其他凭据。

2022-09-15 附录:

我最近在另一个 Keycloak 实例上尝试了我原来答案的配置,但它再次不起作用。

新假设

所以我当前的假设是,它取决于 Keycloak 版本,即它必须至少是版本 18.0.0,因为:

  • In my original answer, I ran a local (Keycloak in Podman in WSL2 on Windows) Keycloak instance in Version 18.0.2, and both Windows Hello with PIN and a Yubikey 5c NFC Security key worked like intended.
  • But then, I tried the same on two remote servers, like I did at the time when writing the original question. One server with a keycloak Version 12.0.1, and the second with 16.1.1. There, only the passwordless-flow worked, but not the loginless-flow. I.e. I got the same error as in the question:

We are sorry... Invalid username or password.

This assumption would also match the Keycloak 18.0.0 release notes, see section WebAuthn improvements. Note, they call the "login-less" flow "id-less".

Keycloak 现在支持 WebAuthn 无 id 身份验证。此功能允许 WebAuthn 安全密钥在身份验证期间识别用户,只要该安全密钥支持驻留密钥

此外

此外,我在互联网上发现,如果想在远程服务器(即不是本地)上进行无登录身份验证,则需要

  1. 必须使用一个real domain name, and not just an IP adress
  2. 必须使用 HTTPS 建立安全连接(或参见此处

概括

为了验证无登录状态,必须:

笔记

这只是一个假设,我只能对其进行部分测试。目前我无法访问安装了最新 Keycloak(即至少 18.0.0)的服务器。