世俱杯 2025

如何使用 Fido2-net-lib 在界面控件ASP.NET Core 中实现通行密钥?

翻译|使用教程|编辑:张蓉|2025-05-22 11:06:07.247|阅读 1 次

概述:在当今的数字环境中,确保安全且用户友好的身份验证方法对于保护用户数据和提升用户体验至关重要。通行密钥认证(Passkey authentication)便是一种备受关注的方法,它利用 FIDO2 标准提供无密码、抗网络钓鱼的安全保护。 在本文中,我们将探讨如何使用 fido2-net-lib(一个简化 FIDO2 身份验证集成的.NET 库)在ASP.NET Core 应用程序中实现通行密钥认证。

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

相关链接:

Syncfusion 推出的ASP.NET Core UI 控件库,由 Essential JS 2 驱动,是构建应用程序的得力工具。它拥有超 90 个组件,能满足各类业务需求。该库轻量且模块化,按需引用可减少应用体积。组件性能卓越,响应式设计且触摸友好,能适配多种设备。
在当今的数字环境中,确保安全且用户友好的身份验证方法对于保护用户数据和提升用户体验至关重要。通行密钥认证(Passkey authentication)便是一种备受关注的方法,它利用 FIDO2 标准提供无密码、抗网络钓鱼的安全保护。
在本文中,我们将探讨如何使用 fido2-net-lib(一个简化 FIDO2 身份验证集成的.NET 库)在ASP.NET Core 应用程序中实现通行密钥认证。

Essential Studio for ASP.NET Core 正版试用下载

什么是通行密钥认证?

通行密钥认证是基于公钥密码学的无密码身份验证方式,用户设备生成密钥对(公钥存服务器、私钥留设备),认证时设备用私钥签名服务器发送的挑战信息,无需传输身份数据即可完成验证,兼具安全性与易用性。

开始使用 fido2-net-lib

要在我们的网站上实现通行密钥认证,需先设置 fido2-net-lib 库。请按照以下步骤操作:
步骤 1:安装 fido2-net-lib
首先,在你的 .NET 项目中安装 fido2-net-lib 包。你可以通过 NuGet 包管理器或 .NET CLI 进行安装:

dotnet add package fido2-net-lib
步骤 2:设置项目
创建一个新的ASP.NET Core 应用程序,或使用现有项目。确保具备处理 API 请求和响应的合适项目结构。
步骤 3:配置 FIDO2 服务
 FIDO2 服务添加到应用程序中。这需要进行必要的配置,例如依赖方信息,包括网站名称、域名和来源。
using Fido2NetLib;
public void ConfigureServices(IServiceCollection services)
{
    services.AddFido2(options =>
    {
        options.ServerDomain = "example.com",
        options.ServerName = "Example",
        options.Origins = "//example.com"
    };
}
步骤 4:通行密钥注册
我们需要实现注册流程,使用户能够为其账户注册通行密钥。这包括生成认证选项、将其发送至用户设备,并在存储凭证前验证响应。
什么是认证选项?
认证选项是注册期间从服务器发送至用户设备的一组参数。这些选项包含关于您网站(依赖方)、用户及所需安全参数的信息。用户设备使用这些选项创建新密钥对,并返回一个服务器可验证和存储的认证对象。
生成认证选项

请参考以下代码示例生成认证选项。

代码1

RequestNewCredential 方法是 FIDO2 注册流程的关键部分。以下是其参数和功能的详细说明:

· 用户信息:第一个参数是 Fido2User 对象,包含用户的显示名称、用户名和唯一标识符等信息。

· 排除列表:第二个参数是 PublicKeyCredentialDescriptor 对象列表,可用于排除某些凭证的使用。例如,可防止用户多次注册同一设备。

· 认证器选择:第三个参数是 AuthenticatorSelection 对象,用于定义选择认证器的标准。例如,可指定仅允许跨平台认证器。

· 认证传输偏好:最后一个参数是 AttestationConveyancePreference 枚举,指示认证数据应如何传输给依赖方,选项包括 None(无)、Indirect(间接)和 Direct(直接)。

生成的认证选项将以 JSON 响应形式发送到用户设备,用户设备将使用这些选项创建新的密钥对并返回一个认证对象。
注册凭证
要完成注册流程,需实现客户端逻辑,使用认证选项创建新凭证。这包括通过 navigator.credentials.create () API 调用传入认证选项。
当客户端返回响应时,我们验证并存储凭证。

代码2

[Route("/register")]
public async Task<JsonResult> MakeCredential([FromBody] AuthenticatorAttestationRawResponse attestationResponse, CancellationToken cancellationToken)
{    // 1. Get the options that we sent to the client
    var jsonOptions = HttpContext.Session.GetString("fido2.attestationOptions");
    var options = CredentialCreateOptions.FromJson(jsonOptions);
    // 2. Create a callback so that lib can verify that the credential id is unique to this user
    IsCredentialIdUniqueToUserAsyncDelegate callback = static async (args, cancellationToken) =>
    {        var users = await Storage.GetUsersByCredentialIdAsync(args.CredentialId, cancellationToken);
        if (users.Count > 0)
            return false;
        return true;    };
    // 2. Verify and make the credentials
    var credential = await fido.MakeNewCredentialAsync(attestationResponse, options, callback, cancellationToken: cancellationToken);
    // 3. Store the credentials in the database
    Storage.AddCredential(options.User, new Credential
    {  Id = credential.Id,
        PublicKey = credential.PublicKey,
        SignCount = credential.SignCount,
        RegDate = DateTimeOffset.UtcNow,
        Transports = credential.Transports,
        IsBackedUp = credential.IsBackedUp,
        userId = userId,
        DeviceName = "User Device 1"    });
    // 4. Return "ok" to the client
    return Json(credential.Status);}

MakeNewCredentialAsync 方法用于验证客户端的认证响应,并在验证成功时创建新凭证。该方法确保注册流程的安全性和完整性。

步骤 5:通行密钥认证

用户完成设备注册后,需实现认证流程以验证其身份。该过程包括生成断言选项、将其发送至用户设备,然后验证响应以完成用户登录。
生成断言选项
请参考以下代码示例生成断言选项。

[Route("/AssertionOptions")]
public JsonResult AssertionOptionsPost(string email)
{
    // 1. Get user from DB
    var user = DemoStorage.GetUser(username);
    // 2. Get registered credentials from the database
    List<PublicKeyCredentialDescriptor> existingCredentials = Storage.GetCredentialsByUser(user).Select(c => c.Descriptor).ToList();
    // 3. Assertion options
    var options = fido.GetAssertionOptions(
        existingCredentials,
        UserVerificationRequirement.Preferred
    );
    // 4. Temporarily store options, session/in-memory cache/redis/db
    HttpContext.Session.SetString("fido2.assertionOptions", options.ToJson());
    // 5. Return options to the client
    return Json(options);
}

GetAssertionOptions 方法生成设备认证所需的断言选项(含网站、用户信息及挑战值)。
验证响应流程:

· 格式转换:将断言选项从 Base64URL 转为 Uint8Array(适配 WebAuthn 加密操作)。

· 生成断言:调用navigator.credentials.get()传入选项,触发设备生成含加密证明的断言。

· 响应准备:将断言组件转为 Base64URL 格式以便网络传输。

· 服务器验证:将响应发送至服务器完成身份验证。

当客户端返回响应时,验证凭证以使用凭证登录。

代码3


当客户端返回响应时,验证凭证以使用凭证登录。

[Route("/VerifyPasskey")]
public async Task<JsonResult> MakeAssertion(VerifyPasskeyResponse clientResponse, CancellationToken cancellationToken)
{    // 1. Get the assertion options we sent the client and remove them from storage
    var jsonOptions = HttpContext.Session.GetString("fido2.assertionOptions");
    HttpContext.Session.Remove("fido2.assertionOptions");
    var options = AssertionOptions.FromJson(jsonOptions);
    // 2. Get registered credentials from the database
    StoredCredential creds = Storage.GetCredentialById(clientResponse.Id);
    // 3. Get credential counter from the database
    var storedCounter = creds.SignatureCounter;
    // 4. Create a callback to check if userhandle owns the credentialId
    IsUserHandleOwnerOfCredentialIdAsync callback = async (args) =>
    {        List<StoredCredential> storedCreds = await DemoStorage.GetCredentialsByUserHandleAsync(args.UserHandle);
        return storedCreds.Exists(c => c.Descriptor.Id.SequenceEqual(args.CredentialId));    };
    // 5. Make the assertion
    var res = await fido.MakeAssertionAsync(clientResponse, options, creds.PublicKey, storedCounter, callback);
    // 6. Store the updated counter
    DemoStorage.UpdateCounter(res.CredentialId, res.Counter);
    // 7. return OK to client
    return Json(res);
}

MakeAssertionAsync 是 Web 认证(WebAuthn)流程中至关重要的服务器端方法,尤其在身份验证阶段发挥关键作用。该方法主要用于验证用户设备生成的断言(Assertion)。
当用户尝试使用通行密钥登录时,其设备会生成一个断言并发送至服务器,此时 MakeAssertionAsync 方法将执行以下操作:

· 反序列化:首先将接收到的断言响应转换为可处理的数据格式。

· 凭证检索:从数据库中获取用户存储的凭证信息(如与通行密钥关联的公钥)。

· 构建验证请求:创建包含挑战值、用户凭证及其他验证参数的请求对象。

· 验证签名:通过 FIDO2 库验证断言的签名有效性,确认用户对凭证的所有权。

若验证成功,用户将被授予系统访问权限。该方法是实现安全无密码认证的核心组件,能够简化认证流程,同时提升安全性与用户体验。
慧都科技是⼀家⾏业数字化解决⽅案公司,专注于软件、⽯油与⼯业领域,以深⼊的业务理解和⾏业经验,帮助企业实现智能化转型与持续竞争优势。
慧都科技作为 Syncfusion 的中国区合作伙伴,Syncfusion 作为 UI 组件研发领域的领先技术提供商,提供 Essential Studio 等强大工具,助力企业实现高效的应用开发与管理。Essential Studio 包括 1900 多个组件和框架,支持 WinForms 等多个主流开发平台,其组件功能强大,可满足大量数据处理需求。Essential Studio 提供丰富的学习资源,包括视频教程、文档和知识库,帮助开发者快速掌握使用方法。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@dpuzeg.cn


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP