翻譯|使用教程|編輯:張蓉|2025-05-22 11:06:07.247|閱讀 1 次
概述:在當(dāng)今的數(shù)字環(huán)境中,確保安全且用戶友好的身份驗(yàn)證方法對(duì)于保護(hù)用戶數(shù)據(jù)和提升用戶體驗(yàn)至關(guān)重要。通行密鑰認(rèn)證(Passkey authentication)便是一種備受關(guān)注的方法,它利用 FIDO2 標(biāo)準(zhǔn)提供無(wú)密碼、抗網(wǎng)絡(luò)釣魚的安全保護(hù)。 在本文中,我們將探討如何使用 fido2-net-lib(一個(gè)簡(jiǎn)化 FIDO2 身份驗(yàn)證集成的.NET 庫(kù))在ASP.NET Core 應(yīng)用程序中實(shí)現(xiàn)通行密鑰認(rèn)證。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
	Syncfusion 推出的ASP.NET Core UI 控件庫(kù),由 Essential JS 2 驅(qū)動(dòng),是構(gòu)建應(yīng)用程序的得力工具。它擁有超 90 個(gè)組件,能滿足各類業(yè)務(wù)需求。該庫(kù)輕量且模塊化,按需引用可減少應(yīng)用體積。組件性能卓越,響應(yīng)式設(shè)計(jì)且觸摸友好,能適配多種設(shè)備。
在當(dāng)今的數(shù)字環(huán)境中,確保安全且用戶友好的身份驗(yàn)證方法對(duì)于保護(hù)用戶數(shù)據(jù)和提升用戶體驗(yàn)至關(guān)重要。通行密鑰認(rèn)證(Passkey authentication)便是一種備受關(guān)注的方法,它利用 FIDO2 標(biāo)準(zhǔn)提供無(wú)密碼、抗網(wǎng)絡(luò)釣魚的安全保護(hù)。
在本文中,我們將探討如何使用 fido2-net-lib(一個(gè)簡(jiǎn)化 FIDO2 身份驗(yàn)證集成的.NET 庫(kù))在ASP.NET Core 應(yīng)用程序中實(shí)現(xiàn)通行密鑰認(rèn)證。
Essential Studio for ASP.NET Core 正版試用下載
通行密鑰認(rèn)證是基于公鑰密碼學(xué)的無(wú)密碼身份驗(yàn)證方式,用戶設(shè)備生成密鑰對(duì)(公鑰存服務(wù)器、私鑰留設(shè)備),認(rèn)證時(shí)設(shè)備用私鑰簽名服務(wù)器發(fā)送的挑戰(zhàn)信息,無(wú)需傳輸身份數(shù)據(jù)即可完成驗(yàn)證,兼具安全性與易用性。
	要在我們的網(wǎng)站上實(shí)現(xiàn)通行密鑰認(rèn)證,需先設(shè)置 fido2-net-lib 庫(kù)。請(qǐng)按照以下步驟操作:
步驟 1:安裝 fido2-net-lib
首先,在你的 .NET 項(xiàng)目中安裝 fido2-net-lib 包。你可以通過(guò) NuGet 包管理器或 .NET CLI 進(jìn)行安裝:
dotnet add package fido2-net-lib步驟 2:設(shè)置項(xiàng)目
using Fido2NetLib;
public void ConfigureServices(IServiceCollection services)
{
    services.AddFido2(options =>
    {
        options.ServerDomain = "example.com",
        options.ServerName = "Example",
        options.Origins = "http://example.com"
    };
}
步驟 4:通行密鑰注冊(cè)請(qǐng)參考以下代碼示例生成認(rèn)證選項(xiàng)。
	 
 
· 用戶信息:第一個(gè)參數(shù)是 Fido2User 對(duì)象,包含用戶的顯示名稱、用戶名和唯一標(biāo)識(shí)符等信息。
· 排除列表:第二個(gè)參數(shù)是 PublicKeyCredentialDescriptor 對(duì)象列表,可用于排除某些憑證的使用。例如,可防止用戶多次注冊(cè)同一設(shè)備。
· 認(rèn)證器選擇:第三個(gè)參數(shù)是 AuthenticatorSelection 對(duì)象,用于定義選擇認(rèn)證器的標(biāo)準(zhǔn)。例如,可指定僅允許跨平臺(tái)認(rèn)證器。
· 認(rèn)證傳輸偏好:最后一個(gè)參數(shù)是 AttestationConveyancePreference 枚舉,指示認(rèn)證數(shù)據(jù)應(yīng)如何傳輸給依賴方,選項(xiàng)包括 None(無(wú))、Indirect(間接)和 Direct(直接)。
	生成的認(rèn)證選項(xiàng)將以 JSON 響應(yīng)形式發(fā)送到用戶設(shè)備,用戶設(shè)備將使用這些選項(xiàng)創(chuàng)建新的密鑰對(duì)并返回一個(gè)認(rèn)證對(duì)象。
注冊(cè)憑證
要完成注冊(cè)流程,需實(shí)現(xiàn)客戶端邏輯,使用認(rèn)證選項(xiàng)創(chuàng)建新憑證。這包括通過(guò) navigator.credentials.create () API 調(diào)用傳入認(rèn)證選項(xiàng)。
 當(dāng)客戶端返回響應(yīng)時(shí),我們驗(yàn)證并存儲(chǔ)憑證。
	 
 
[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 方法用于驗(yàn)證客戶端的認(rèn)證響應(yīng),并在驗(yàn)證成功時(shí)創(chuàng)建新憑證。該方法確保注冊(cè)流程的安全性和完整性。
	用戶完成設(shè)備注冊(cè)后,需實(shí)現(xiàn)認(rèn)證流程以驗(yàn)證其身份。該過(guò)程包括生成斷言選項(xiàng)、將其發(fā)送至用戶設(shè)備,然后驗(yàn)證響應(yīng)以完成用戶登錄。
生成斷言選項(xiàng)
 請(qǐng)參考以下代碼示例生成斷言選項(xiàng)。
[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 方法生成設(shè)備認(rèn)證所需的斷言選項(xiàng)(含網(wǎng)站、用戶信息及挑戰(zhàn)值)。
驗(yàn)證響應(yīng)流程: 
· 格式轉(zhuǎn)換:將斷言選項(xiàng)從 Base64URL 轉(zhuǎn)為 Uint8Array(適配 WebAuthn 加密操作)。
· 生成斷言:調(diào)用navigator.credentials.get()傳入選項(xiàng),觸發(fā)設(shè)備生成含加密證明的斷言。
· 響應(yīng)準(zhǔn)備:將斷言組件轉(zhuǎn)為 Base64URL 格式以便網(wǎng)絡(luò)傳輸。
· 服務(wù)器驗(yàn)證:將響應(yīng)發(fā)送至服務(wù)器完成身份驗(yàn)證。
當(dāng)客戶端返回響應(yīng)時(shí),驗(yàn)證憑證以使用憑證登錄。
	 
 
	
當(dāng)客戶端返回響應(yīng)時(shí),驗(yàn)證憑證以使用憑證登錄。
[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);
}
· 反序列化:首先將接收到的斷言響應(yīng)轉(zhuǎn)換為可處理的數(shù)據(jù)格式。
· 憑證檢索:從數(shù)據(jù)庫(kù)中獲取用戶存儲(chǔ)的憑證信息(如與通行密鑰關(guān)聯(lián)的公鑰)。
· 構(gòu)建驗(yàn)證請(qǐng)求:創(chuàng)建包含挑戰(zhàn)值、用戶憑證及其他驗(yàn)證參數(shù)的請(qǐng)求對(duì)象。
· 驗(yàn)證簽名:通過(guò) FIDO2 庫(kù)驗(yàn)證斷言的簽名有效性,確認(rèn)用戶對(duì)憑證的所有權(quán)。
	若驗(yàn)證成功,用戶將被授予系統(tǒng)訪問(wèn)權(quán)限。該方法是實(shí)現(xiàn)安全無(wú)密碼認(rèn)證的核心組件,能夠簡(jiǎn)化認(rèn)證流程,同時(shí)提升安全性與用戶體驗(yàn)。
慧都科技是?家?業(yè)數(shù)字化解決?案公司,專注于軟件、?油與?業(yè)領(lǐng)域,以深?的業(yè)務(wù)理解和?業(yè)經(jīng)驗(yàn),幫助企業(yè)實(shí)現(xiàn)智能化轉(zhuǎn)型與持續(xù)競(jìng)爭(zhēng)優(yōu)勢(shì)。
慧都科技作為 Syncfusion 的中國(guó)區(qū)合作伙伴,Syncfusion 作為 UI 組件研發(fā)領(lǐng)域的領(lǐng)先技術(shù)提供商,提供 Essential Studio 等強(qiáng)大工具,助力企業(yè)實(shí)現(xiàn)高效的應(yīng)用開發(fā)與管理。Essential Studio 包括 1900 多個(gè)組件和框架,支持 WinForms 等多個(gè)主流開發(fā)平臺(tái),其組件功能強(qiáng)大,可滿足大量數(shù)據(jù)處理需求。Essential Studio 提供豐富的學(xué)習(xí)資源,包括視頻教程、文檔和知識(shí)庫(kù),幫助開發(fā)者快速掌握使用方法。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@ke049m.cn