using ApplianceRepair; using ApplianceRepair.Components; using Microsoft.EntityFrameworkCore; using ApplianceRepair.Components.Account; using Microsoft.AspNetCore.Components.Authorization; using Microsoft.AspNetCore.Identity; var builder = WebApplication.CreateBuilder(args); var connectionString = builder.Configuration.GetConnectionString("DefaultConnection") ?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found."); // Add services to the container. builder.Services.AddRazorComponents() .AddInteractiveServerComponents(); builder.Services.AddDbContext(options => options.UseSqlite(connectionString)); builder.Services.AddMemoryCache(); builder.Services.AddLogging(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddCascadingAuthenticationState(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddAuthentication(options => { options.DefaultScheme = IdentityConstants.ApplicationScheme; options.DefaultSignInScheme = IdentityConstants.ExternalScheme; }) .AddIdentityCookies(); builder.Services.AddIdentityCore(options => options.SignIn.RequireConfirmedAccount = true) .AddRoles() .AddEntityFrameworkStores() .AddSignInManager() .AddDefaultTokenProviders(); builder.Services.AddServerSideBlazor() .AddHubOptions(options => { options.MaximumReceiveMessageSize = 10 * 1024 * 1024; // 10MB }); builder.Services.AddSingleton, IdentityNoOpEmailSender>(); var app = builder.Build(); using (var scope = app.Services.CreateScope()) { var services = scope.ServiceProvider; try { var context = services.GetRequiredService(); await context.Database.MigrateAsync(); await DatabaseContext.Initialize(context); var roleManager = scope.ServiceProvider.GetRequiredService>(); var userManager = scope.ServiceProvider.GetRequiredService>(); var logger = scope.ServiceProvider.GetRequiredService>(); if (!await roleManager.RoleExistsAsync("Admin")) { await roleManager.CreateAsync(new IdentityRole("Admin")); } var domain = builder.Configuration.GetValue("SiteDomain"); var adminEmail = $"admin@{domain}"; var adminUser = await userManager.FindByEmailAsync(adminEmail); if (adminUser == null) { adminUser = new IdentityUser { UserName = adminEmail, Email = adminEmail, EmailConfirmed = true }; const string chars = "ABCDEFGHJKLMNOPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz0123456789!@#$%^&*?"; var random = new Random(); var pass = new string(Enumerable.Repeat(chars, 16) .Select(s => s[random.Next(s.Length)]).ToArray()) + "1aA!"; var result = await userManager.CreateAsync(adminUser, pass); if (result.Succeeded) { await userManager.AddToRoleAsync(adminUser, "Admin"); logger.LogCritical("****************************************************"); logger.LogCritical($"ADMIN USER CREATED. Email: {adminEmail}"); logger.LogCritical($"TEMPORARY PASSWORD: {pass}"); logger.LogCritical("****************************************************"); } } } catch (Exception ex) { var logger = services.GetRequiredService>(); logger.LogError(ex, "An error occurred while migrating or seeding the database."); } } // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error", createScopeForErrors: true); } app.UseAntiforgery(); app.MapStaticAssets(); app.MapRazorComponents() .AddInteractiveServerRenderMode(); app.MapAdditionalIdentityEndpoints();; app.Run();