如何通过WebAuthN API获取Windows登录令牌?
针对你用FIDO2安全密钥获取Windows登录令牌的需求,结合你提到的WebAuthN.dll未文档化函数,以下是实际可尝试的实现方向:
解析FIDO2断言中的账户身份信息
你注意到的WebAuthNDecodeAccountInformation函数是核心入口,它能从FIDO2断言返回的userHandle和rpIdHash二进制数据中,解析出关联的Windows用户SID(安全标识符)、账户名等关键信息。在你现有的C++断言示例基础上,完成认证获取断言后,直接调用这个函数(需要自行定义函数原型,因为未文档化),传入断言结构体中的对应字段,就能拿到用户的身份标识。通过LSA接口发起FIDO2认证登录
拿到用户SID后,不能直接生成令牌,需要通过Windows本地安全机构(LSA)的LsaLogonUser函数发起登录请求。这里需要构造专门的FIDO2认证凭证结构体(而非传统的密码凭证),指定认证包为"FIDO"或对应Windows版本的专属包(不同版本可能有差异),并将FIDO2断言的签名、用户信息等作为凭证数据传入。这个步骤需要SeSecurityPrivilege权限,且需要处理LSA的返回状态码,确保认证流程合法。复用Windows Hello for Business的认证通路
既然同一密钥可用于Windows登录,说明密钥已与Windows Hello for Business绑定。可以参考Hello的认证逻辑:完成FIDO2断言后,调用WebAuthNAssertionGetSignature提取签名数据,然后通过winbio.dll中的相关函数(如WinBioLogonUser)将签名作为生物识别凭证提交,触发系统的登录令牌生成流程。这种方式更贴近原生Windows登录逻辑,兼容性更好,但同样需要处理未公开的函数调用细节。注意版本兼容性与权限要求
所有操作必须在Windows 10 1903及以上版本(FIDO2登录支持的最低版本)执行,且进程需要本地管理员权限或SeSecurityPrivilege权限。另外,Azure AD域用户的令牌获取需要确保断言已通过AAD服务器的验证,可能需要额外发起验证请求,避免本地解析的身份信息无效。
内容的提问来源于stack exchange,提问作者Edz1o

