From 963932775da97343f2d155afed97166ae1fdfd21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20=C3=85berg?= Date: Tue, 2 Sep 2025 15:13:45 +0200 Subject: [PATCH 1/5] Clean up asp.net hosting --- Demo/Program.cs | 80 +++++++++++++++++++++++++++++++++++++-------- Demo/Startup.cs | 86 ------------------------------------------------- 2 files changed, 67 insertions(+), 99 deletions(-) delete mode 100644 Demo/Startup.cs diff --git a/Demo/Program.cs b/Demo/Program.cs index c81f5bb06..50a9b7826 100644 --- a/Demo/Program.cs +++ b/Demo/Program.cs @@ -1,18 +1,72 @@ -namespace Fido2Demo; +using Fido2Demo; +using Fido2NetLib; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Rewrite; -public class Program +var builder = WebApplication.CreateBuilder(args); + +// Configure Services +builder.Services.AddRazorPages(opts => { - public static void Main(string[] args) - { - CreateHostBuilder(args).Build().Run(); - } + // we don't care about antiforgery in the demo + opts.Conventions.ConfigureFilter(new IgnoreAntiforgeryTokenAttribute()); +}); + +// Use the in-memory implementation of IDistributedCache. +builder.Services.AddMemoryCache(); +builder.Services.AddDistributedMemoryCache(); + +builder.Services.AddSession(options => +{ + // Set a short timeout for easy testing. + options.IdleTimeout = TimeSpan.FromMinutes(2); + options.Cookie.HttpOnly = true; + // Strict SameSite mode is required because the default mode used + // by ASP.NET Core 3 isn't understood by the Conformance Tool + // and breaks conformance testing + options.Cookie.SameSite = SameSiteMode.Unspecified; +}); - public static IHostBuilder CreateHostBuilder(string[] args) +builder.Services.AddFido2(options => +{ + options.ServerDomain = builder.Configuration["fido2:serverDomain"]; + options.ServerName = "FIDO2 Test"; + options.Origins = builder.Configuration.GetSection("fido2:origins").Get>(); + options.TimestampDriftTolerance = builder.Configuration.GetValue("fido2:timestampDriftTolerance"); + options.MDSCacheDirPath = builder.Configuration["fido2:MDSCacheDirPath"]; + options.BackupEligibleCredentialPolicy = builder.Configuration.GetValue("fido2:backupEligibleCredentialPolicy"); + options.BackedUpCredentialPolicy = builder.Configuration.GetValue("fido2:backedUpCredentialPolicy"); +}) +.AddCachedMetadataService(config => +{ + config.AddFidoMetadataRepository(httpClientBuilder => { - return Host.CreateDefaultBuilder(args) - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }); - } + //TODO: any specific config you want for accessing the MDS + }); +}); + +var app = builder.Build(); + +// Configure Pipeline +if (app.Environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} +else +{ + app.UseExceptionHandler("/Error"); + app.UseRewriter(new RewriteOptions().AddRedirectToWWwIfPasswordlessDomain()); } + +// Enforce HTTPS redirection for all requests +app.UseHttpsRedirection(); + +app.UseSession(); +app.UseStaticFiles(); +app.UseRouting(); + +app.MapFallbackToPage("/", "/overview"); +app.MapRazorPages(); +app.MapControllers(); + +app.Run(); diff --git a/Demo/Startup.cs b/Demo/Startup.cs deleted file mode 100644 index d5f33990b..000000000 --- a/Demo/Startup.cs +++ /dev/null @@ -1,86 +0,0 @@ -using Fido2NetLib; - -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Rewrite; - -namespace Fido2Demo; - -public class Startup -{ - public Startup(IConfiguration configuration) - { - Configuration = configuration; - } - - public IConfiguration Configuration { get; } - - // This method gets called by the runtime. Use this method to add services to the container. - public void ConfigureServices(IServiceCollection services) - { - services.AddRazorPages(opts => - { - // we don't care about antiforgery in the demo - opts.Conventions.ConfigureFilter(new IgnoreAntiforgeryTokenAttribute()); - }); - - // Use the in-memory implementation of IDistributedCache. - services.AddMemoryCache(); - services.AddDistributedMemoryCache(); - - services.AddSession(options => - { - // Set a short timeout for easy testing. - options.IdleTimeout = TimeSpan.FromMinutes(2); - options.Cookie.HttpOnly = true; - // Strict SameSite mode is required because the default mode used - // by ASP.NET Core 3 isn't understood by the Conformance Tool - // and breaks conformance testing - options.Cookie.SameSite = SameSiteMode.Unspecified; - }); - - services.AddFido2(options => - { - options.ServerDomain = Configuration["fido2:serverDomain"]; - options.ServerName = "FIDO2 Test"; - options.Origins = Configuration.GetSection("fido2:origins").Get>(); - options.TimestampDriftTolerance = Configuration.GetValue("fido2:timestampDriftTolerance"); - options.MDSCacheDirPath = Configuration["fido2:MDSCacheDirPath"]; - options.BackupEligibleCredentialPolicy = Configuration.GetValue("fido2:backupEligibleCredentialPolicy"); - options.BackedUpCredentialPolicy = Configuration.GetValue("fido2:backedUpCredentialPolicy"); - }) - .AddCachedMetadataService(config => - { - config.AddFidoMetadataRepository(httpClientBuilder => - { - //TODO: any specific config you want for accessing the MDS - }); - }); - } - - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - else - { - app.UseExceptionHandler("/Error"); - app.UseRewriter(new RewriteOptions().AddRedirectToWWwIfPasswordlessDomain()); - } - - // Enforce HTTPS redirection for all requests - app.UseHttpsRedirection(); - - app.UseSession(); - app.UseStaticFiles(); - app.UseRouting(); - app.UseEndpoints(endpoints => - { - endpoints.MapFallbackToPage("/", "/overview"); - endpoints.MapRazorPages(); - endpoints.MapControllers(); - }); - } -} From 2341521b1ad588bc7998e6cb48df96cc7964aa9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20=C3=85berg?= Date: Tue, 2 Sep 2025 15:16:09 +0200 Subject: [PATCH 2/5] use main as branhc --- Demo/Program.cs | 2 ++ Demo/UrlHelperExtensions.cs | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Demo/Program.cs b/Demo/Program.cs index 50a9b7826..0dfe698a4 100644 --- a/Demo/Program.cs +++ b/Demo/Program.cs @@ -32,6 +32,8 @@ options.ServerDomain = builder.Configuration["fido2:serverDomain"]; options.ServerName = "FIDO2 Test"; options.Origins = builder.Configuration.GetSection("fido2:origins").Get>(); + + // Other options available: options.TimestampDriftTolerance = builder.Configuration.GetValue("fido2:timestampDriftTolerance"); options.MDSCacheDirPath = builder.Configuration["fido2:MDSCacheDirPath"]; options.BackupEligibleCredentialPolicy = builder.Configuration.GetValue("fido2:backupEligibleCredentialPolicy"); diff --git a/Demo/UrlHelperExtensions.cs b/Demo/UrlHelperExtensions.cs index 0d690918a..d6fcc5dfc 100644 --- a/Demo/UrlHelperExtensions.cs +++ b/Demo/UrlHelperExtensions.cs @@ -6,6 +6,6 @@ public static class UrlHelperExtensions { public static string ToGithub(this IUrlHelper url, string path) { - return "https://github.com/passwordless-lib/fido2-net-lib/blob/master/" + path; + return "https://github.com/passwordless-lib/fido2-net-lib/blob/main/" + path; } } From 3f5fc6c8ffce35a3f5bbc0f2c4bf45f6102fb927 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20=C3=85berg?= Date: Tue, 2 Sep 2025 15:19:07 +0200 Subject: [PATCH 3/5] Move to Helper folder --- Demo/{ => Helpers}/RouteHelperExtensions.cs | 0 Demo/{ => Helpers}/UrlHelperExtensions.cs | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename Demo/{ => Helpers}/RouteHelperExtensions.cs (100%) rename Demo/{ => Helpers}/UrlHelperExtensions.cs (100%) diff --git a/Demo/RouteHelperExtensions.cs b/Demo/Helpers/RouteHelperExtensions.cs similarity index 100% rename from Demo/RouteHelperExtensions.cs rename to Demo/Helpers/RouteHelperExtensions.cs diff --git a/Demo/UrlHelperExtensions.cs b/Demo/Helpers/UrlHelperExtensions.cs similarity index 100% rename from Demo/UrlHelperExtensions.cs rename to Demo/Helpers/UrlHelperExtensions.cs From 8d35556ac453de017226c0663588e909647d012a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20=C3=85berg?= Date: Tue, 2 Sep 2025 15:24:37 +0200 Subject: [PATCH 4/5] Use file-based using statement --- Demo/Pages/_options.cshtml.cs | 9 ++++----- Demo/Pages/custom.cshtml.cs | 9 ++++----- Demo/Pages/dashboard.cshtml.cs | 15 +++++++-------- Demo/Pages/mfa.cshtml.cs | 15 +++++++-------- Demo/Pages/overview.cshtml.cs | 9 ++++----- Demo/Pages/passwordless.cshtml.cs | 9 ++++----- Demo/Pages/usernameless.cshtml.cs | 9 ++++----- 7 files changed, 34 insertions(+), 41 deletions(-) diff --git a/Demo/Pages/_options.cshtml.cs b/Demo/Pages/_options.cshtml.cs index aefaff3cd..e58c1f5b8 100644 --- a/Demo/Pages/_options.cshtml.cs +++ b/Demo/Pages/_options.cshtml.cs @@ -1,11 +1,10 @@ using Microsoft.AspNetCore.Mvc.RazorPages; -namespace Fido2Demo.Pages +namespace Fido2Demo.Pages; + +public class _optionsModel : PageModel { - public class _optionsModel : PageModel + public void OnGet() { - public void OnGet() - { - } } } diff --git a/Demo/Pages/custom.cshtml.cs b/Demo/Pages/custom.cshtml.cs index 6fd3796e0..1eeb93cbb 100644 --- a/Demo/Pages/custom.cshtml.cs +++ b/Demo/Pages/custom.cshtml.cs @@ -1,11 +1,10 @@ using Microsoft.AspNetCore.Mvc.RazorPages; -namespace Fido2Demo +namespace Fido2Demo; + +public class CustomModel : PageModel { - public class CustomModel : PageModel + public void OnGet() { - public void OnGet() - { - } } } diff --git a/Demo/Pages/dashboard.cshtml.cs b/Demo/Pages/dashboard.cshtml.cs index 6491a169f..a8ca98f23 100644 --- a/Demo/Pages/dashboard.cshtml.cs +++ b/Demo/Pages/dashboard.cshtml.cs @@ -1,14 +1,13 @@ using Microsoft.AspNetCore.Mvc.RazorPages; -namespace Fido2Demo.Pages +namespace Fido2Demo.Pages; + +public class dashboardModel : PageModel { - public class dashboardModel : PageModel + public void OnGet(string username) { - public void OnGet(string username) - { - this.Username = username; - } - - public string Username { get; set; } + this.Username = username; } + + public string Username { get; set; } } diff --git a/Demo/Pages/mfa.cshtml.cs b/Demo/Pages/mfa.cshtml.cs index 344a2e8eb..95db6b433 100644 --- a/Demo/Pages/mfa.cshtml.cs +++ b/Demo/Pages/mfa.cshtml.cs @@ -1,15 +1,14 @@ using Microsoft.AspNetCore.Mvc.RazorPages; -namespace Fido2Demo +namespace Fido2Demo; + +public class MfaModel : PageModel { - public class MfaModel : PageModel + public void OnGet() { - public void OnGet() - { - } + } - public void OnPost() - { - } + public void OnPost() + { } } diff --git a/Demo/Pages/overview.cshtml.cs b/Demo/Pages/overview.cshtml.cs index 64a81b4bf..d7498e4f1 100644 --- a/Demo/Pages/overview.cshtml.cs +++ b/Demo/Pages/overview.cshtml.cs @@ -1,11 +1,10 @@ using Microsoft.AspNetCore.Mvc.RazorPages; -namespace Fido2Demo +namespace Fido2Demo; + +public class OverviewModel : PageModel { - public class OverviewModel : PageModel + public void OnGet() { - public void OnGet() - { - } } } diff --git a/Demo/Pages/passwordless.cshtml.cs b/Demo/Pages/passwordless.cshtml.cs index 72111224c..6130b6ca8 100644 --- a/Demo/Pages/passwordless.cshtml.cs +++ b/Demo/Pages/passwordless.cshtml.cs @@ -1,11 +1,10 @@ using Microsoft.AspNetCore.Mvc.RazorPages; -namespace Fido2Demo +namespace Fido2Demo; + +public class PasswordLessModel : PageModel { - public class PasswordLessModel : PageModel + public void OnGet() { - public void OnGet() - { - } } } diff --git a/Demo/Pages/usernameless.cshtml.cs b/Demo/Pages/usernameless.cshtml.cs index a56c9217e..d32e69539 100644 --- a/Demo/Pages/usernameless.cshtml.cs +++ b/Demo/Pages/usernameless.cshtml.cs @@ -1,11 +1,10 @@ using Microsoft.AspNetCore.Mvc.RazorPages; -namespace Fido2Demo +namespace Fido2Demo; + +public class UsernameLessModel : PageModel { - public class UsernameLessModel : PageModel + public void OnGet() { - public void OnGet() - { - } } } From cf674aad8b0e37e73ac04fd2db33617d99a8c480 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20=C3=85berg?= Date: Tue, 2 Sep 2025 15:26:33 +0200 Subject: [PATCH 5/5] Use Collection Expressions --- Demo/ConformanceTestController.cs | 2 +- Demo/ConformanceTesting.cs | 5 ++--- Demo/DemoController.cs | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Demo/ConformanceTestController.cs b/Demo/ConformanceTestController.cs index b6b3b0309..a10a8d62f 100644 --- a/Demo/ConformanceTestController.cs +++ b/Demo/ConformanceTestController.cs @@ -40,7 +40,7 @@ public OkObjectResult MakeCredentialOptionsTest([FromBody] TEST_MakeCredentialPa { var attType = opts.Attestation; - var username = Array.Empty(); + byte[] username = []; try { diff --git a/Demo/ConformanceTesting.cs b/Demo/ConformanceTesting.cs index 7bb63366a..42abc96f0 100644 --- a/Demo/ConformanceTesting.cs +++ b/Demo/ConformanceTesting.cs @@ -16,11 +16,10 @@ public static IMetadataService MetadataServiceInstance(string cacheDir, string o { if (_instance == null) { - var repos = new List - { + List repos = [ new ConformanceMetadataRepository(null, origin), new FileSystemMetadataRepository(cacheDir) - }; + ]; var simpleService = new ConformanceMetadataService(repos); simpleService.InitializeAsync().Wait(); _instance = simpleService; diff --git a/Demo/DemoController.cs b/Demo/DemoController.cs index 5c2da078c..efc06de9b 100644 --- a/Demo/DemoController.cs +++ b/Demo/DemoController.cs @@ -144,7 +144,7 @@ public ActionResult AssertionOptionsPost([FromForm] string username, [FromForm] { try { - var existingCredentials = new List(); + List existingCredentials = []; if (!string.IsNullOrEmpty(username)) {