前言
我是网络安全的新手。我一直在犹豫是否要在个人项目中实现身份验证系统,因为我被安全隐患(主要是密码和用户身份验证(吓坏了。然而,我对WebAuthn和苹果的Passkeys感到非常兴奋,因为这个标准承诺更安全,应该意味着我的责任更少!然而,我做了一个噩梦,试图设置一个我认为应该是简单的演示项目。只是没有足够的信息或例子。
问题
我已经创建了一个简单的.NET6Webneneneba API项目和一个简单Angular项目。以下是迄今为止的流程:
- 用户在Angular App中输入用户名以注册
- Angular向服务器提出挑战。然后服务器使用Fido2-Nuget包生成挑战
- Angular接收挑战并使用该挑战生成新的
PublicKeyCredential
并调用navigator.credentials.create(...);
以上内容非常适用。的下一步应该是将新的PublicKeyCredential
发送到服务器,以便服务器可以存储此凭据以便稍后进行身份验证。问题是这个PublicKeyCredential
使用的ArrayBuffers
无法序列化并发送到服务器(至少不容易(。我只是做错了吗?我只是找不到任何可靠的方法将PublicKeyCredential
返回服务器。
我尝试过的
- 我已经尝试按照这里的建议将
ArrayBuffers
编码为字符串和base64字符串,但这对我来说不起作用。当凭据到达服务器时,我解码byte[]
,并尝试调用_fido2.MakeNewCredentialAsync(...)
;证明对象无效。未处理状态。是SimpleValue"> - 我尝试了这篇文章中概述的建议,但这个包也假设服务器也将使用这个包。我的服务器是一个ASP.NET Web API,而不是Node.js应用程序,所以我不知道如何使用这个库
- 我看过Fido2-Nuget软件包提供的演示库。这种实现方式的问题在于;"前端";以及";"后端";使用我不熟悉的框架一起托管。正因为如此,他们可以偷工减料。他们不必将PublicKeyCredential"发送回"服务器,因为它已经在服务器上了!我想把我的Angular应用程序和服务器分开(如果可能的话(
结论
如果有人有WebAuthn在一个非常简单的环境中工作的例子,我很乐意看看。或者,如果你对我的实施有建议,也欢迎!
PublicKeyCredential.response
,在create
调用之后,将是AuthenticatorAttestationResponse。该对象上有函数getPublicKey
和getAuthenticatorData
(见5.2.1.1(,它们将为您提供所需的信息。但事实上,它们都返回ArrayBuffer。
您可以使用类似btoa(String.fromCharCode.apply(null, new Uint8Array(a)))
的代码对ArrayBuffera
进行base64编码。
虽然这个问题的答案最终帮助我将PublicKeyCredential拿到了服务器上(经过多次哭泣和咬牙切齿(,但由于本文中概述的问题,它最终被证明是无用的。WebAuthn似乎不是为"拆分架构"而设计的。这意味着您必须将Web应用程序和API托管在同一域中。
正因为如此,我基本上正在重新思考我的整个方法,并重新尝试实现WebAuthn。祝我好运!
即使我打出这个答案,我仍然心存疑虑。这根本不可能是事实,不是吗?如果FIDO2交换必须在同一域上进行,那么移动应用程序应该如何实现WebAuthn?移动应用程序是否需要加载某种web视图?是否所有Web应用程序都应托管在与依赖方相同的域上?或者期望加载某种iframe?我很困惑,但决心让WebAuthn为我工作。