Add project files.

This commit is contained in:
Khwezi Mngoma
2026-06-05 22:07:25 +02:00
parent 59ea7de742
commit 437e8c5c08
978 changed files with 151911 additions and 0 deletions
@@ -0,0 +1,164 @@
using System;
using System.Threading.Tasks;
using HealthChecks.UI.Client;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Diagnostics.HealthChecks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using IdentityModel;
using Duende.IdentityServer;
using Duende.IdentityServer.Configuration;
using LiteCharmsSecurity.Admin.EntityFramework.Shared.DbContexts;
using LiteCharmsSecurity.Admin.EntityFramework.Shared.Entities.Identity;
using Skoruba.Duende.IdentityServer.Shared.Configuration.Helpers;
using LiteCharmsSecurity.STS.Identity.Configuration;
using LiteCharmsSecurity.STS.Identity.Configuration.Constants;
using LiteCharmsSecurity.STS.Identity.Configuration.Interfaces;
using LiteCharmsSecurity.STS.Identity.Helpers;
using LiteCharmsSecurity.STS.Identity.Passkeys;
using Microsoft.AspNetCore.Identity;
namespace LiteCharmsSecurity.STS.Identity
{
public class Startup
{
public IConfiguration Configuration { get; }
public IWebHostEnvironment Environment { get; }
public Startup(IWebHostEnvironment environment, IConfiguration configuration)
{
Configuration = configuration;
Environment = environment;
}
public void ConfigureServices(IServiceCollection services)
{
var rootConfiguration = CreateRootConfiguration();
services.AddSingleton(rootConfiguration);
// Configure ServerSideSessions
services.Configure<ServerSideSessionsConfiguration>(Configuration.GetSection(ServerSideSessionsConfiguration.SectionName));
// Register DbContexts for IdentityServer and Identity
RegisterDbContexts(services);
// Save data protection keys to db, using a common application name shared between Admin and STS
services.AddDataProtection<IdentityServerDataProtectionDbContext>(Configuration);
// Add email senders which is currently setup for SendGrid and SMTP
services.AddEmailSenders(Configuration);
// Add services for authentication, including Identity model and external providers
RegisterAuthentication(services);
// Add HSTS options
RegisterHstsOptions(services);
// Add all dependencies for Asp.Net Core Identity in MVC - these dependencies are injected into generic Controllers
// Including settings for MVC and Localization
// If you want to change primary keys or use another db model for Asp.Net Core Identity:
services.AddMvcWithLocalization<UserIdentity, string>(Configuration);
services.AddRazorPages();
// Add authorization policies for MVC
RegisterAuthorization(services);
// Add IHttpContextAccessor for Passkey TagHelper
services.AddHttpContextAccessor();
// Configure IdentityPasskeyOptions for development
if (Environment.IsDevelopment())
{
services.Configure<IdentityPasskeyOptions>(options =>
{
// Allow localhost origins for development
options.ValidateOrigin = context => ValueTask.FromResult(
context.Origin.StartsWith("https://localhost") || context.Origin.StartsWith("http://localhost"));
});
}
services.AddIdSHealthChecks<IdentityServerConfigurationDbContext, IdentityServerPersistedGrantDbContext, AdminIdentityDbContext, IdentityServerDataProtectionDbContext>(Configuration);
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseCookiePolicy();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
app.UsePathBase(Configuration.GetValue<string>("BasePath"));
app.UseStaticFiles();
UseAuthentication(app);
// Add custom security headers
app.UseSecurityHeaders(Configuration);
app.UseMvcLocalizationServices();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoint =>
{
// Map passkey endpoints for passkey authentication
endpoint.MapPasskeyEndpoints<UserIdentity>();
endpoint.MapDefaultControllerRoute();
endpoint.MapHealthChecks("/health", new HealthCheckOptions
{
ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
});
});
}
public virtual void RegisterDbContexts(IServiceCollection services)
{
services.RegisterDbContexts<AdminIdentityDbContext, IdentityServerConfigurationDbContext, IdentityServerPersistedGrantDbContext, IdentityServerDataProtectionDbContext>(Configuration);
}
public virtual void RegisterAuthentication(IServiceCollection services)
{
services.AddAuthenticationServices<AdminIdentityDbContext, UserIdentity, UserIdentityRole>(Configuration);
services.AddIdentityServer<IdentityServerConfigurationDbContext, IdentityServerPersistedGrantDbContext, UserIdentity>(Configuration);
}
public virtual void RegisterAuthorization(IServiceCollection services)
{
var rootConfiguration = CreateRootConfiguration();
services.AddAuthorizationPolicies(rootConfiguration);
}
public virtual void UseAuthentication(IApplicationBuilder app)
{
app.UseIdentityServer();
}
public virtual void RegisterHstsOptions(IServiceCollection services)
{
services.AddHsts(options =>
{
options.Preload = true;
options.IncludeSubDomains = true;
options.MaxAge = TimeSpan.FromDays(365);
});
}
protected IRootConfiguration CreateRootConfiguration()
{
var rootConfiguration = new RootConfiguration();
Configuration.GetSection(ConfigurationConsts.AdminConfigurationKey).Bind(rootConfiguration.AdminConfiguration);
Configuration.GetSection(ConfigurationConsts.RegisterConfigurationKey).Bind(rootConfiguration.RegisterConfiguration);
return rootConfiguration;
}
}
}