Program.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using Fido2NetLib;
  2. using Microsoft.AspNetCore.Authentication.JwtBearer;
  3. using Microsoft.AspNetCore.Mvc;
  4. using Microsoft.IdentityModel.Tokens;
  5. using Passwordless;
  6. var builder = WebApplication.CreateBuilder(args);
  7. // Add services to the container.
  8. // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
  9. builder.Services.AddEndpointsApiExplorer();
  10. builder.Services.AddSwaggerGen();
  11. builder.Services.AddFido2(options =>
  12. {
  13. options.ServerDomain = "localhost";
  14. options.ServerName = "FIDO2 Test";
  15. options.Origins = ["http://localhost:5172"];
  16. options.TimestampDriftTolerance = 300000;
  17. });
  18. builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
  19. .AddJwtBearer(options =>
  20. {
  21. options.RequireHttpsMetadata = false; // dev only!!!
  22. options.Authority = "http://localhost:5172";
  23. options.TokenValidationParameters = new TokenValidationParameters
  24. {
  25. ValidIssuer = "http://localhost:5172",
  26. ValidAudience = "http://localhost:5172"
  27. };
  28. });
  29. builder.Services.AddAuthorization(authorizationOptions =>
  30. {
  31. authorizationOptions.AddPolicy("MagicClaim", policyBuilder => policyBuilder.RequireClaim("permissions", "MagicClaim"));
  32. });
  33. builder.Services.AddMemoryCache();
  34. builder.Services.AddTransient<OptionsCache>();
  35. builder.Services.AddTransient<CredentialManager>();
  36. var app = builder.Build();
  37. // Configure the HTTP request pipeline.
  38. if (app.Environment.IsDevelopment())
  39. {
  40. app.UseSwagger();
  41. app.UseSwaggerUI();
  42. }
  43. app.UseStaticFiles();
  44. app.UseHttpsRedirection();
  45. app.UseAuthorization();
  46. app.MapGet("/buildCredentialOptions", ([FromQuery] string login, CredentialManager credMan) =>
  47. credMan.BuildCredentialOptions(login))
  48. .WithName("BuildCredentialOptions")
  49. .WithOpenApi();
  50. app.MapPost("/registerCredential", async ([FromQuery] string login, [FromBody] AuthenticatorAttestationRawResponse attestationResponse, CredentialManager credMan) =>
  51. await credMan.RegisterCredential(login, attestationResponse))
  52. .WithName("RegisterCredential")
  53. .WithOpenApi();
  54. app.MapGet("/buildAssertionOptions", async ([FromQuery] string login, CredentialManager credMan) =>
  55. await credMan.BuildAssertionOptions(login))
  56. .WithName("BuildAssertionOptions")
  57. .WithOpenApi();
  58. app.MapPost("/verifyCredential", async ([FromBody] AuthenticatorAssertionRawResponse assertionResponse, CredentialManager credMan) =>
  59. await credMan.VerifyCredential(assertionResponse))
  60. .WithName("VerifyCredential")
  61. .WithOpenApi();
  62. app.MapGet("/protected", () => "Success!").WithName("Protected").RequireAuthorization(policy =>
  63. {
  64. policy.RequireClaim("MagicClaim");
  65. });
  66. app.Run();