using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.EntityFrameworkCore; using Rs_system.Data; using Rs_system.Services; var builder = WebApplication.CreateBuilder(args); // Add services to the container. var connectionString = builder.Configuration.GetConnectionString("PostgreSQL") ?? throw new InvalidOperationException("Connection string 'PostgreSQL' not found."); builder.Services.AddDbContext(options => options.UseNpgsql(connectionString, npgsqlOptions => { npgsqlOptions.EnableRetryOnFailure( maxRetryCount: 3, maxRetryDelay: TimeSpan.FromSeconds(5), errorCodesToAdd: null); npgsqlOptions.CommandTimeout(30); }) .UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking) .EnableSensitiveDataLogging(builder.Environment.IsDevelopment()) .EnableDetailedErrors(builder.Environment.IsDevelopment())); builder.Services.AddDatabaseDeveloperPageExceptionFilter(); // Register services builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddSingleton(); builder.Services.AddMemoryCache(options => { options.SizeLimit = 1024; // 1024 cache entries max options.CompactionPercentage = 0.25; // Compact when 25% of entries are expired }); // Configure cookie authentication builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.LoginPath = "/Account/Login"; options.LogoutPath = "/Account/Logout"; options.AccessDeniedPath = "/Account/AccessDenied"; options.Cookie.Name = "RS.Auth"; options.Cookie.HttpOnly = true; options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest; options.ExpireTimeSpan = TimeSpan.FromHours(8); options.SlidingExpiration = true; }); builder.Services.AddControllersWithViews(options => { var policy = new Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build(); options.Filters.Add(new Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter(policy)); options.Filters.Add(new Rs_system.Filters.DynamicAuthorizationFilter()); }); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseMigrationsEndPoint(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.MapStaticAssets(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}") .WithStaticAssets(); app.Run();