From e6e227a671b53530a63f658bc1a795cc19bebf83 Mon Sep 17 00:00:00 2001 From: Mackinnon Buck Date: Thu, 5 Feb 2026 15:58:14 -0800 Subject: [PATCH 1/7] Add `Aaguid` property to `UserPasskeyInfo` and `IdentityPasskeyData` --- src/Identity/Core/src/PasskeyHandler.cs | 5 ++++- .../src/IdentityUserPasskeyExtensions.cs | 4 +++- .../Extensions.Core/src/PublicAPI.Unshipped.txt | 2 ++ src/Identity/Extensions.Core/src/UserPasskeyInfo.cs | 12 ++++++++++-- .../Extensions.Stores/src/IdentityPasskeyData.cs | 8 ++++++++ .../Extensions.Stores/src/PublicAPI.Unshipped.txt | 2 ++ .../src/IdentitySpecificationTestBase.cs | 1 + .../InMemoryUserStore.cs | 7 ++++++- .../IdentitySample.PasskeyUI/InMemoryUserStore.cs | 2 ++ src/Identity/test/InMemory.Test/InMemoryStore.cs | 4 +++- .../test/Shared/PocoModel/PocoUserPasskey.cs | 8 ++++++++ 11 files changed, 49 insertions(+), 6 deletions(-) diff --git a/src/Identity/Core/src/PasskeyHandler.cs b/src/Identity/Core/src/PasskeyHandler.cs index c3c7ff3e7cd2..0081d672fa00 100644 --- a/src/Identity/Core/src/PasskeyHandler.cs +++ b/src/Identity/Core/src/PasskeyHandler.cs @@ -349,7 +349,10 @@ await VerifyClientDataAsync( isBackupEligible: authenticatorData.IsBackupEligible, isBackedUp: authenticatorData.IsBackedUp, attestationObject: response.AttestationObject.ToArray(), - clientDataJson: response.ClientDataJSON.ToArray()); + clientDataJson: response.ClientDataJSON.ToArray()) + { + Aaguid = attestedCredentialData.Aaguid.ToArray(), + }; // 28. Process the client extension outputs in clientExtensionResults and the authenticator extension // outputs in the extensions in authData as required by the Relying Party. diff --git a/src/Identity/EntityFrameworkCore/src/IdentityUserPasskeyExtensions.cs b/src/Identity/EntityFrameworkCore/src/IdentityUserPasskeyExtensions.cs index 4e2f4a040a58..5c869ae014e4 100644 --- a/src/Identity/EntityFrameworkCore/src/IdentityUserPasskeyExtensions.cs +++ b/src/Identity/EntityFrameworkCore/src/IdentityUserPasskeyExtensions.cs @@ -14,6 +14,7 @@ public void UpdateFromUserPasskeyInfo(UserPasskeyInfo passkeyInfo) passkey.Data.SignCount = passkeyInfo.SignCount; passkey.Data.IsBackedUp = passkeyInfo.IsBackedUp; passkey.Data.IsUserVerified = passkeyInfo.IsUserVerified; + passkey.Data.Aaguid = passkeyInfo.Aaguid; } public UserPasskeyInfo ToUserPasskeyInfo() @@ -29,7 +30,8 @@ public UserPasskeyInfo ToUserPasskeyInfo() passkey.Data.AttestationObject, passkey.Data.ClientDataJson) { - Name = passkey.Data.Name + Name = passkey.Data.Name, + Aaguid = passkey.Data.Aaguid, }; } } diff --git a/src/Identity/Extensions.Core/src/PublicAPI.Unshipped.txt b/src/Identity/Extensions.Core/src/PublicAPI.Unshipped.txt index 7dc5c58110bf..8e7ea89bc368 100644 --- a/src/Identity/Extensions.Core/src/PublicAPI.Unshipped.txt +++ b/src/Identity/Extensions.Core/src/PublicAPI.Unshipped.txt @@ -1 +1,3 @@ #nullable enable +Microsoft.AspNetCore.Identity.UserPasskeyInfo.Aaguid.get -> byte[]? +Microsoft.AspNetCore.Identity.UserPasskeyInfo.Aaguid.set -> void diff --git a/src/Identity/Extensions.Core/src/UserPasskeyInfo.cs b/src/Identity/Extensions.Core/src/UserPasskeyInfo.cs index 9fde211e9390..a8454f2dd04d 100644 --- a/src/Identity/Extensions.Core/src/UserPasskeyInfo.cs +++ b/src/Identity/Extensions.Core/src/UserPasskeyInfo.cs @@ -17,12 +17,12 @@ public sealed class UserPasskeyInfo /// The public key for the passkey. /// The time when the passkey was created. /// The signature counter for the passkey. - /// The passkey's attestation object. - /// The passkey's client data JSON. /// The transports supported by this passkey. /// Indicates if the passkey has a verified user. /// Indicates if the passkey is eligible for backup. /// Indicates if the passkey is currently backed up. + /// The passkey's attestation object. + /// The passkey's client data JSON. public UserPasskeyInfo( byte[] credentialId, byte[] publicKey, @@ -110,4 +110,12 @@ public UserPasskeyInfo( /// See . /// public byte[] ClientDataJson { get; } + + /// + /// Gets or sets the AAGUID of the authenticator that created this passkey. + /// + /// + /// See . + /// + public byte[]? Aaguid { get; set; } } diff --git a/src/Identity/Extensions.Stores/src/IdentityPasskeyData.cs b/src/Identity/Extensions.Stores/src/IdentityPasskeyData.cs index 16930dde1e40..83d09d030c6d 100644 --- a/src/Identity/Extensions.Stores/src/IdentityPasskeyData.cs +++ b/src/Identity/Extensions.Stores/src/IdentityPasskeyData.cs @@ -68,4 +68,12 @@ public class IdentityPasskeyData /// See . /// public virtual byte[] ClientDataJson { get; set; } = default!; + + /// + /// Gets or sets the AAGUID of the authenticator that created this passkey. + /// + /// + /// See . + /// + public virtual byte[]? Aaguid { get; set; } } diff --git a/src/Identity/Extensions.Stores/src/PublicAPI.Unshipped.txt b/src/Identity/Extensions.Stores/src/PublicAPI.Unshipped.txt index 7dc5c58110bf..50785d9d785e 100644 --- a/src/Identity/Extensions.Stores/src/PublicAPI.Unshipped.txt +++ b/src/Identity/Extensions.Stores/src/PublicAPI.Unshipped.txt @@ -1 +1,3 @@ #nullable enable +virtual Microsoft.AspNetCore.Identity.IdentityPasskeyData.Aaguid.get -> byte[]? +virtual Microsoft.AspNetCore.Identity.IdentityPasskeyData.Aaguid.set -> void diff --git a/src/Identity/Specification.Tests/src/IdentitySpecificationTestBase.cs b/src/Identity/Specification.Tests/src/IdentitySpecificationTestBase.cs index 7f587d5f87ee..aca4c64c6649 100644 --- a/src/Identity/Specification.Tests/src/IdentitySpecificationTestBase.cs +++ b/src/Identity/Specification.Tests/src/IdentitySpecificationTestBase.cs @@ -819,5 +819,6 @@ private static void AssertPasskeysEqual(UserPasskeyInfo expected, UserPasskeyInf Assert.Equal(expected.AttestationObject, actual.AttestationObject); Assert.Equal(expected.ClientDataJson, actual.ClientDataJson); Assert.Equal(expected.Transports, actual.Transports); + Assert.Equal(expected.Aaguid, actual.Aaguid); } } diff --git a/src/Identity/samples/IdentitySample.PasskeyConformance/InMemoryUserStore.cs b/src/Identity/samples/IdentitySample.PasskeyConformance/InMemoryUserStore.cs index 5f7fccdf9b4f..2c05dec64bce 100644 --- a/src/Identity/samples/IdentitySample.PasskeyConformance/InMemoryUserStore.cs +++ b/src/Identity/samples/IdentitySample.PasskeyConformance/InMemoryUserStore.cs @@ -113,7 +113,11 @@ public Task RemovePasskeyAsync(TUser user, byte[] credentialId, CancellationToke p.IsBackupEligible, p.IsBackedUp, p.AttestationObject, - p.ClientDataJson); + p.ClientDataJson) + { + Name = p.Name, + Aaguid = p.Aaguid, + }; [return: NotNullIfNotNull(nameof(p))] private static PocoUserPasskey? ToPocoUserPasskey(TUser user, UserPasskeyInfo? p) @@ -131,6 +135,7 @@ public Task RemovePasskeyAsync(TUser user, byte[] credentialId, CancellationToke IsBackedUp = p.IsBackedUp, AttestationObject = p.AttestationObject, ClientDataJson = p.ClientDataJson, + Aaguid = p.Aaguid, }; public void Dispose() diff --git a/src/Identity/samples/IdentitySample.PasskeyUI/InMemoryUserStore.cs b/src/Identity/samples/IdentitySample.PasskeyUI/InMemoryUserStore.cs index b45a7d255a40..0b4da891f06b 100644 --- a/src/Identity/samples/IdentitySample.PasskeyUI/InMemoryUserStore.cs +++ b/src/Identity/samples/IdentitySample.PasskeyUI/InMemoryUserStore.cs @@ -116,6 +116,7 @@ public Task RemovePasskeyAsync(TUser user, byte[] credentialId, CancellationToke p.ClientDataJson) { Name = p.Name, + Aaguid = p.Aaguid, }; [return: NotNullIfNotNull(nameof(p))] @@ -134,6 +135,7 @@ public Task RemovePasskeyAsync(TUser user, byte[] credentialId, CancellationToke IsBackedUp = p.IsBackedUp, AttestationObject = p.AttestationObject, ClientDataJson = p.ClientDataJson, + Aaguid = p.Aaguid, }; public void Dispose() diff --git a/src/Identity/test/InMemory.Test/InMemoryStore.cs b/src/Identity/test/InMemory.Test/InMemoryStore.cs index c5860db84589..e5522d97b7fe 100644 --- a/src/Identity/test/InMemory.Test/InMemoryStore.cs +++ b/src/Identity/test/InMemory.Test/InMemoryStore.cs @@ -215,7 +215,8 @@ private static UserPasskeyInfo ToUserPasskeyInfo(PocoUserPasskey p) p.AttestationObject, p.ClientDataJson) { - Name = p.Name + Name = p.Name, + Aaguid = p.Aaguid }; private static PocoUserPasskey ToPocoUserPasskey(TUser user, UserPasskeyInfo p) @@ -233,6 +234,7 @@ private static PocoUserPasskey ToPocoUserPasskey(TUser user, UserPasskey IsBackedUp = p.IsBackedUp, AttestationObject = p.AttestationObject, ClientDataJson = p.ClientDataJson, + Aaguid = p.Aaguid, }; public IQueryable Roles diff --git a/src/Identity/test/Shared/PocoModel/PocoUserPasskey.cs b/src/Identity/test/Shared/PocoModel/PocoUserPasskey.cs index 9a4ec0e610a5..6c0c455737ad 100644 --- a/src/Identity/test/Shared/PocoModel/PocoUserPasskey.cs +++ b/src/Identity/test/Shared/PocoModel/PocoUserPasskey.cs @@ -84,4 +84,12 @@ public class PocoUserPasskey where TKey : IEquatable /// See . /// public virtual byte[] ClientDataJson { get; set; } = []; + + /// + /// Gets or sets the AAGUID of the authenticator that created this passkey. + /// + /// + /// See . + /// + public virtual byte[] Aaguid { get; set; } } From 9a54cfc823d939e039dee0b8bdbfecf8627e9f5a Mon Sep 17 00:00:00 2001 From: Mackinnon Buck Date: Thu, 5 Feb 2026 15:58:49 -0800 Subject: [PATCH 2/7] Update Blazor Web App template UI --- .../Account/Pages/Manage/Passkeys.razor | 16 ++++- .../Account/PasskeyAuthenticators.cs | 62 +++++++++++++++++++ 2 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/Components/Account/PasskeyAuthenticators.cs diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/Components/Account/Pages/Manage/Passkeys.razor b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/Components/Account/Pages/Manage/Passkeys.razor index b4bc96b4f376..8cae9934ab95 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/Components/Account/Pages/Manage/Passkeys.razor +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/Components/Account/Pages/Manage/Passkeys.razor @@ -22,7 +22,10 @@ @foreach (var passkey in currentPasskeys) { - @(passkey.Name ?? "Unnamed passkey") + +
@PasskeyAuthenticators.GetDisplayName(passkey)
+ Created @passkey.CreatedAt.LocalDateTime.ToString("MMM d, yyyy") + @{ var credentialId = Base64Url.EncodeToString(passkey.CredentialId); @@ -130,7 +133,16 @@ else return; } - // Immediately prompt the user to enter a name for the credential + // If the authenticator is known, assign the inferred name and go back to the passkeys list + if (PasskeyAuthenticators.TryGetDefaultDisplayName(attestationResult.Passkey, out var defaultName)) + { + attestationResult.Passkey.Name = defaultName; + await UserManager.AddOrUpdatePasskeyAsync(user, attestationResult.Passkey); + RedirectManager.RedirectToCurrentPageWithStatus("Your passkey was added successfully.", HttpContext); + return; + } + + // For unknown authenticators, prompt the user to enter a name var credentialIdBase64Url = Base64Url.EncodeToString(attestationResult.Passkey.CredentialId); RedirectManager.RedirectTo($"Account/Manage/RenamePasskey/{credentialIdBase64Url}"); } diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/Components/Account/PasskeyAuthenticators.cs b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/Components/Account/PasskeyAuthenticators.cs new file mode 100644 index 000000000000..0a6e7b2a3b62 --- /dev/null +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/Components/Account/PasskeyAuthenticators.cs @@ -0,0 +1,62 @@ +using System.Diagnostics.CodeAnalysis; +using Microsoft.AspNetCore.Identity; + +namespace BlazorWebCSharp._1.Components.Account; + +// Maps passkey AAGUIDs to authenticator names. +// The AAGUID data is sourced from the community-maintained list at +// https://github.com/passkeydeveloper/passkey-authenticator-aaguids. +// You can add or modify authenticators as needed. +public static class PasskeyAuthenticators +{ + private static readonly Dictionary KnownAuthenticators = new() + { + // Google Password Manager + [new("ea9b8d66-4d01-1d21-3ce4-b6b48cb575d4")] = "Google Password Manager", + + // Apple iCloud Keychain + [new("fbfc3007-154e-4ecc-8c0b-6e020557d7bd")] = "iCloud Keychain", + [new("dd4ec289-e01d-41c9-bb89-70fa845d4bf2")] = "iCloud Keychain", + + // Microsoft Windows Hello + [new("08987058-cadc-4b81-b6e1-30de50dcbe96")] = "Windows Hello", + [new("9ddd1817-af5a-4672-a2b9-3e3dd95000a9")] = "Windows Hello", + [new("6028b017-b1d4-4c02-b4b3-afcdafc96bb2")] = "Windows Hello", + + // 1Password + [new("bada5566-a7aa-401f-bd96-45619a55120d")] = "1Password", + [new("b5397571-8af2-4d30-9d48-eeb8eee6e9c6")] = "1Password", + + // Bitwarden + [new("d548826e-79b4-db40-a3d8-11116f7e8349")] = "Bitwarden", + [new("cc45f64e-52a2-451b-831a-4edd8022a202")] = "Bitwarden", + }; + + public static bool TryGetDefaultDisplayName(UserPasskeyInfo passkey, [NotNullWhen(true)] out string? defaultName) + { + if (passkey.Aaguid is { Length: 16 } aaguid && + KnownAuthenticators.TryGetValue(new Guid(aaguid, bigEndian: true), out var name)) + { + defaultName = name; + return true; + } + + defaultName = null; + return false; + } + + public static string GetDisplayName(UserPasskeyInfo passkey) + { + if (!string.IsNullOrEmpty(passkey.Name)) + { + return passkey.Name; + } + + if (TryGetDefaultDisplayName(passkey, out var name)) + { + return name; + } + + return "Unnamed passkey"; + } +} From f02f7c4adcbfbc4bda5688873c6bc26dfd1c00f1 Mon Sep 17 00:00:00 2001 From: Mackinnon Buck Date: Fri, 6 Feb 2026 10:09:46 -0800 Subject: [PATCH 3/7] Display passkey creation date in UTC --- .../Components/Account/Pages/Manage/Passkeys.razor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/Components/Account/Pages/Manage/Passkeys.razor b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/Components/Account/Pages/Manage/Passkeys.razor index 8cae9934ab95..8ef5097f047a 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/Components/Account/Pages/Manage/Passkeys.razor +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/Components/Account/Pages/Manage/Passkeys.razor @@ -24,7 +24,7 @@
@PasskeyAuthenticators.GetDisplayName(passkey)
- Created @passkey.CreatedAt.LocalDateTime.ToString("MMM d, yyyy") + Created @passkey.CreatedAt.UtcDateTime.ToString("MMM d, yyyy") (UTC) @{ From 1d38d09a1344a8355cfcfd0095b03dfa9669e805 Mon Sep 17 00:00:00 2001 From: Mackinnon Buck Date: Fri, 6 Feb 2026 11:07:02 -0800 Subject: [PATCH 4/7] Don't update the AAGUID after passkey creation --- .../EntityFrameworkCore/src/IdentityUserPasskeyExtensions.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Identity/EntityFrameworkCore/src/IdentityUserPasskeyExtensions.cs b/src/Identity/EntityFrameworkCore/src/IdentityUserPasskeyExtensions.cs index 5c869ae014e4..d429e1ce8ac7 100644 --- a/src/Identity/EntityFrameworkCore/src/IdentityUserPasskeyExtensions.cs +++ b/src/Identity/EntityFrameworkCore/src/IdentityUserPasskeyExtensions.cs @@ -10,11 +10,12 @@ internal static class IdentityUserPasskeyExtensions { public void UpdateFromUserPasskeyInfo(UserPasskeyInfo passkeyInfo) { + // We only mutate properties that can be update after passkey creation. + // See https://www.w3.org/TR/webauthn-3/#authn-ceremony-update-credential-record passkey.Data.Name = passkeyInfo.Name; passkey.Data.SignCount = passkeyInfo.SignCount; passkey.Data.IsBackedUp = passkeyInfo.IsBackedUp; passkey.Data.IsUserVerified = passkeyInfo.IsUserVerified; - passkey.Data.Aaguid = passkeyInfo.Aaguid; } public UserPasskeyInfo ToUserPasskeyInfo() From f4f8610fd0150519680002c503766f127179fc9a Mon Sep 17 00:00:00 2001 From: Mackinnon Buck Date: Fri, 6 Feb 2026 11:12:00 -0800 Subject: [PATCH 5/7] Only update passkey once --- .../Components/Account/Pages/Manage/Passkeys.razor | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/Components/Account/Pages/Manage/Passkeys.razor b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/Components/Account/Pages/Manage/Passkeys.razor index 8ef5097f047a..1536f17305be 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/Components/Account/Pages/Manage/Passkeys.razor +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/Components/Account/Pages/Manage/Passkeys.razor @@ -126,6 +126,12 @@ else return; } + // If the authenticator is known, assign the inferred name + if (PasskeyAuthenticators.TryGetDefaultDisplayName(attestationResult.Passkey, out var defaultName)) + { + attestationResult.Passkey.Name = defaultName; + } + var addPasskeyResult = await UserManager.AddOrUpdatePasskeyAsync(user, attestationResult.Passkey); if (!addPasskeyResult.Succeeded) { @@ -133,11 +139,9 @@ else return; } - // If the authenticator is known, assign the inferred name and go back to the passkeys list - if (PasskeyAuthenticators.TryGetDefaultDisplayName(attestationResult.Passkey, out var defaultName)) + // If a name was inferred, go back to the passkeys list + if (!string.IsNullOrEmpty(attestationResult.Passkey.Name)) { - attestationResult.Passkey.Name = defaultName; - await UserManager.AddOrUpdatePasskeyAsync(user, attestationResult.Passkey); RedirectManager.RedirectToCurrentPageWithStatus("Your passkey was added successfully.", HttpContext); return; } From e929514d8ad22cad628d23ea6312932cc4285d88 Mon Sep 17 00:00:00 2001 From: Mackinnon Buck Date: Fri, 6 Feb 2026 13:43:01 -0800 Subject: [PATCH 6/7] Fix typo in comment for UpdateFromUserPasskeyInfo --- .../EntityFrameworkCore/src/IdentityUserPasskeyExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Identity/EntityFrameworkCore/src/IdentityUserPasskeyExtensions.cs b/src/Identity/EntityFrameworkCore/src/IdentityUserPasskeyExtensions.cs index d429e1ce8ac7..f69fdf0d9649 100644 --- a/src/Identity/EntityFrameworkCore/src/IdentityUserPasskeyExtensions.cs +++ b/src/Identity/EntityFrameworkCore/src/IdentityUserPasskeyExtensions.cs @@ -10,7 +10,7 @@ internal static class IdentityUserPasskeyExtensions { public void UpdateFromUserPasskeyInfo(UserPasskeyInfo passkeyInfo) { - // We only mutate properties that can be update after passkey creation. + // We only mutate properties that can be updated after passkey creation. // See https://www.w3.org/TR/webauthn-3/#authn-ceremony-update-credential-record passkey.Data.Name = passkeyInfo.Name; passkey.Data.SignCount = passkeyInfo.SignCount; From 30a5258a5d68412987675d12170e949203292859 Mon Sep 17 00:00:00 2001 From: Mackinnon Buck Date: Fri, 6 Feb 2026 13:44:06 -0800 Subject: [PATCH 7/7] Update test baselines --- .../test/Templates.Tests/template-baselines.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/ProjectTemplates/test/Templates.Tests/template-baselines.json b/src/ProjectTemplates/test/Templates.Tests/template-baselines.json index 7aae2f4c7c19..70a3ab5f29b1 100644 --- a/src/ProjectTemplates/test/Templates.Tests/template-baselines.json +++ b/src/ProjectTemplates/test/Templates.Tests/template-baselines.json @@ -634,6 +634,7 @@ "Components/Account/Pages/ResetPassword.razor", "Components/Account/Pages/ResetPasswordConfirmation.razor", "Components/Account/Pages/_Imports.razor", + "Components/Account/PasskeyAuthenticators.cs", "Components/Account/PasskeyInputModel.cs", "Components/Account/PasskeyOperation.cs", "Components/Account/Shared/ExternalLoginPicker.razor", @@ -832,6 +833,7 @@ "Components/Account/Pages/ResetPassword.razor", "Components/Account/Pages/ResetPasswordConfirmation.razor", "Components/Account/Pages/_Imports.razor", + "Components/Account/PasskeyAuthenticators.cs", "Components/Account/PasskeyInputModel.cs", "Components/Account/PasskeyOperation.cs", "Components/Account/Shared/ExternalLoginPicker.razor", @@ -960,6 +962,7 @@ "Components/Account/Pages/ResetPassword.razor", "Components/Account/Pages/ResetPasswordConfirmation.razor", "Components/Account/Pages/_Imports.razor", + "Components/Account/PasskeyAuthenticators.cs", "Components/Account/PasskeyInputModel.cs", "Components/Account/PasskeyOperation.cs", "Components/Account/Shared/ExternalLoginPicker.razor", @@ -1172,6 +1175,7 @@ "{ProjectName}/Components/Account/Pages/ResetPassword.razor", "{ProjectName}/Components/Account/Pages/ResetPasswordConfirmation.razor", "{ProjectName}/Components/Account/Pages/_Imports.razor", + "{ProjectName}/Components/Account/PasskeyAuthenticators.cs", "{ProjectName}/Components/Account/PasskeyInputModel.cs", "{ProjectName}/Components/Account/PasskeyOperation.cs", "{ProjectName}/Components/Account/Shared/ExternalLoginPicker.razor", @@ -1383,6 +1387,7 @@ "{ProjectName}/Components/Account/Pages/ResetPassword.razor", "{ProjectName}/Components/Account/Pages/ResetPasswordConfirmation.razor", "{ProjectName}/Components/Account/Pages/_Imports.razor", + "{ProjectName}/Components/Account/PasskeyAuthenticators.cs", "{ProjectName}/Components/Account/PasskeyInputModel.cs", "{ProjectName}/Components/Account/PasskeyOperation.cs", "{ProjectName}/Components/Account/Shared/ExternalLoginPicker.razor", @@ -1842,6 +1847,7 @@ "{ProjectName}/Components/Account/Pages/ResetPassword.razor", "{ProjectName}/Components/Account/Pages/ResetPasswordConfirmation.razor", "{ProjectName}/Components/Account/Pages/_Imports.razor", + "{ProjectName}/Components/Account/PasskeyAuthenticators.cs", "{ProjectName}/Components/Account/PasskeyInputModel.cs", "{ProjectName}/Components/Account/PasskeyOperation.cs", "{ProjectName}/Components/Account/Shared/ExternalLoginPicker.razor", @@ -1918,6 +1924,7 @@ "Components/Account/Pages/ResetPassword.razor", "Components/Account/Pages/ResetPasswordConfirmation.razor", "Components/Account/Pages/_Imports.razor", + "Components/Account/PasskeyAuthenticators.cs", "Components/Account/PasskeyInputModel.cs", "Components/Account/PasskeyOperation.cs", "Components/Account/Shared/ExternalLoginPicker.razor", @@ -2063,6 +2070,7 @@ "{ProjectName}/Components/Account/Pages/ResetPassword.razor", "{ProjectName}/Components/Account/Pages/ResetPasswordConfirmation.razor", "{ProjectName}/Components/Account/Pages/_Imports.razor", + "{ProjectName}/Components/Account/PasskeyAuthenticators.cs", "{ProjectName}/Components/Account/PasskeyInputModel.cs", "{ProjectName}/Components/Account/PasskeyOperation.cs", "{ProjectName}/Components/Account/Shared/ExternalLoginPicker.razor", @@ -2198,6 +2206,7 @@ "{ProjectName}/Components/Account/Pages/ResetPassword.razor", "{ProjectName}/Components/Account/Pages/ResetPasswordConfirmation.razor", "{ProjectName}/Components/Account/Pages/_Imports.razor", + "{ProjectName}/Components/Account/PasskeyAuthenticators.cs", "{ProjectName}/Components/Account/PasskeyInputModel.cs", "{ProjectName}/Components/Account/PasskeyOperation.cs", "{ProjectName}/Components/Account/Shared/ExternalLoginPicker.razor",