Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
118 changes: 67 additions & 51 deletions EssentialCSharp.Web/Program.cs
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
using Azure.Monitor.OpenTelemetry.AspNetCore;
using EssentialCSharp.Web.Areas.Identity.Data;
using EssentialCSharp.Web.Areas.Identity.Services.PasswordValidators;
using EssentialCSharp.Web.Data;
using EssentialCSharp.Web.Extensions;
using EssentialCSharp.Web.Middleware;
using EssentialCSharp.Web.Services;
using EssentialCSharp.Web.Services.Referrals;
using Azure.Monitor.OpenTelemetry.AspNetCore;
using EssentialCSharp.Web.Areas.Identity.Data;
using EssentialCSharp.Web.Areas.Identity.Services.PasswordValidators;
using EssentialCSharp.Web.Data;
using EssentialCSharp.Web.Extensions;
using EssentialCSharp.Web.Middleware;
using EssentialCSharp.Web.Services;
using EssentialCSharp.Web.Services.Referrals;
using Mailjet.Client;
using Microsoft.AspNetCore.HttpOverrides;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.UI.Services;
using Microsoft.EntityFrameworkCore;

namespace EssentialCSharp.Web;

public partial class Program
{
private static void Main(string[] args)
{
using Microsoft.AspNetCore.Identity.UI.Services;
using Microsoft.EntityFrameworkCore;

namespace EssentialCSharp.Web;
public partial class Program
{
private static void Main(string[] args)
{
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);

builder.Services.Configure<ForwardedHeadersOptions>(options =>
Expand All @@ -31,20 +31,35 @@ private static void Main(string[] args)
options.KnownNetworks.Clear();
options.KnownProxies.Clear();
});

ConfigurationManager configuration = builder.Configuration;
ConfigurationManager configuration = builder.Configuration;
string connectionString = builder.Configuration.GetConnectionString("EssentialCSharpWebContextConnection") ?? throw new InvalidOperationException("Connection string 'EssentialCSharpWebContextConnection' not found.");

builder.Logging.AddConsole();
builder.Services.AddHealthChecks();
builder.Logging.AddConsole();
builder.Services.AddHealthChecks();

// Create a temporary logger for startup logging
using var loggerFactory = LoggerFactory.Create(loggingBuilder =>
loggingBuilder.AddConsole().SetMinimumLevel(LogLevel.Information));
var logger = loggerFactory.CreateLogger<Program>();

if (!builder.Environment.IsDevelopment())
{
// Configure Azure Application Insights with OpenTelemetry
builder.Services.AddOpenTelemetry().UseAzureMonitor();
builder.Services.AddApplicationInsightsTelemetry();
builder.Services.AddServiceProfiler();
}
// Configure Azure Application Insights with OpenTelemetry only if connection string is available
var appInsightsConnectionString = builder.Configuration.GetConnectionString("ApplicationInsights")
?? builder.Configuration["ApplicationInsights:ConnectionString"];

if (!string.IsNullOrEmpty(appInsightsConnectionString))
{
builder.Services.AddOpenTelemetry().UseAzureMonitor();
builder.Services.AddApplicationInsightsTelemetry();
builder.Services.AddServiceProfiler();
}
else
{
logger.LogWarning("Application Insights connection string not found. Telemetry collection will be disabled.");
}
}

builder.Services.AddDbContext<EssentialCSharpWebContext>(options => options.UseSqlServer(connectionString));
builder.Services.AddDefaultIdentity<EssentialCSharpWebUser>(options =>
Expand All @@ -70,9 +85,9 @@ private static void Main(string[] args)
.AddEntityFrameworkStores<EssentialCSharpWebContext>()
.AddPasswordValidator<UsernameOrEmailAsPasswordValidator<EssentialCSharpWebUser>>()
.AddPasswordValidator<Top100000PasswordValidator<EssentialCSharpWebUser>>();

builder.Configuration
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
builder.Configuration
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables();

builder.Services.ConfigureApplicationCookie(options =>
Expand Down Expand Up @@ -113,22 +128,22 @@ private static void Main(string[] args)
return userPasswordStore;
}
throw new NotSupportedException("The default UI requires a user store with password support.");
});
});

//TODO: Implement the anti-forgery token with every POST/PUT request: https://learn.microsoft.com/en-us/aspnet/core/security/anti-request-forgery
//TODO: Implement the anti-forgery token with every POST/PUT request: https://learn.microsoft.com/en-us/aspnet/core/security/anti-request-forgery

if (!builder.Environment.IsDevelopment())
{
builder.Services.AddTransient<IEmailSender, EmailSender>();
}
builder.Services.Configure<AuthMessageSenderOptions>(builder.Configuration.GetSection(AuthMessageSenderOptions.AuthMessageSender));

// Add services to the container.
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddCaptchaService(builder.Configuration.GetSection(CaptchaOptions.CaptchaSender));
builder.Services.AddSingleton<ISiteMappingService, SiteMappingService>();
builder.Services.AddHostedService<DatabaseMigrationService>();
builder.Services.AddScoped<IReferralService, ReferralService>();
builder.Services.AddScoped<IReferralService, ReferralService>();

if (!builder.Environment.IsDevelopment())
{
Expand Down Expand Up @@ -161,11 +176,12 @@ private static void Main(string[] args)
}



WebApplication app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseForwardedHeaders();
app.UseHsts();
Expand All @@ -176,25 +192,25 @@ private static void Main(string[] args)
{
app.UseDeveloperExceptionPage();
app.UseForwardedHeaders();
}
}

app.MapHealthChecks("/healthz");

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();

app.UseAuthentication();
app.UseAuthentication();
app.UseAuthorization();
app.UseMiddleware<ReferralMiddleware>();


app.MapRazorPages();
app.MapRazorPages();
app.MapDefaultControllerRoute();

app.MapFallbackToController("Index", "Home");

app.Run();
app.MapFallbackToController("Index", "Home");
app.Run();
}
}
}