- Add a new passkey
+ @if (currentPasskeys is { Count: >= MaxPasskeyCount })
+ {
+ You have reached the maximum number of allowed passkeys. Please delete one before adding a new one.
+ }
+ else
+ {
+ Add a new passkey
+ }
+
@code {
+ private const int MaxPasskeyCount = 100;
+
private ApplicationUser? user;
private IList? currentPasskeys;
@@ -100,6 +110,12 @@ else
return;
}
+ if (currentPasskeys!.Count >= MaxPasskeyCount)
+ {
+ RedirectManager.RedirectToCurrentPageWithStatus($"Error: You have reached the maximum number of allowed passkeys.", HttpContext);
+ return;
+ }
+
var attestationResult = await SignInManager.PerformPasskeyAttestationAsync(Input.CredentialJson);
if (!attestationResult.Succeeded)
{
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/Components/Account/Pages/Manage/RenamePasskey.razor b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/Components/Account/Pages/Manage/RenamePasskey.razor
index 80595b5bcc1e..a28d1bb85a50 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/Components/Account/Pages/Manage/RenamePasskey.razor
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/Components/Account/Pages/Manage/RenamePasskey.razor
@@ -89,6 +89,7 @@
private sealed class InputModel
{
[Required]
+ [StringLength(200, ErrorMessage = "Passkey names must be no longer than {1} characters.")]
public string Name { get; set; } = "";
}
}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/Components/Account/Shared/PasskeySubmit.razor b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/Components/Account/Shared/PasskeySubmit.razor
index f3d6f52c21be..9db61ffa5f3d 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/Components/Account/Shared/PasskeySubmit.razor
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/Components/Account/Shared/PasskeySubmit.razor
@@ -35,6 +35,6 @@
protected override void OnInitialized()
{
- tokens = Services.GetRequiredService()?.GetTokens(HttpContext);
+ tokens = Services.GetService()?.GetTokens(HttpContext);
}
}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/appsettings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/appsettings.json
index 2924c11940bb..3aa431a5deac 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/appsettings.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWebCSharp.1/appsettings.json
@@ -4,7 +4,7 @@
//#if (UseLocalDB)
// "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-BlazorWebCSharp__1-53bc9b9d-9d6a-45d4-8429-2a2761773502;Trusted_Connection=True;MultipleActiveResultSets=true"
//#else
-// "DefaultConnection": "DataSource=Data\\app.db;Cache=Shared"
+// "DefaultConnection": "DataSource=Data/app.db;Cache=Shared"
//#endif
// },
////#endif
diff --git a/src/ProjectTemplates/test/Templates.Blazor.Tests/BlazorTemplateTest.cs b/src/ProjectTemplates/test/Templates.Blazor.Tests/BlazorTemplateTest.cs
index ddc5ee58c81c..f6334c1cca6a 100644
--- a/src/ProjectTemplates/test/Templates.Blazor.Tests/BlazorTemplateTest.cs
+++ b/src/ProjectTemplates/test/Templates.Blazor.Tests/BlazorTemplateTest.cs
@@ -233,6 +233,14 @@ await page.EvaluateAsync("""
await page.ClickAsync("text=Add a new passkey");
await page.WaitForSelectorAsync("text=Enter a name for your passkey");
+
+ // First check that we can't register a passkey with a long name.
+ var longName = new string('a', count: 201);
+ await page.FillAsync("[name=\"Input.Name\"]", longName);
+ await page.ClickAsync("text=Continue");
+ await page.WaitForSelectorAsync("text=Passkey names must be no longer than 200 characters.");
+
+ // Now register a passkey with a valid name
await page.FillAsync("[name=\"Input.Name\"]", "My passkey");
await page.ClickAsync("text=Continue");