1
0
mirror of https://github.com/ncblakely/GiantsTools synced 2024-11-16 19:55:36 +01:00
GiantsTools/Giants.WebApi/Program.cs

171 lines
6.0 KiB
C#
Raw Normal View History

namespace Giants.Web
{
2022-09-09 07:31:24 +02:00
using Autofac;
using Autofac.Extensions.DependencyInjection;
2022-09-06 01:41:46 +02:00
using AutoMapper;
using Giants.Services;
using Microsoft.AspNetCore.Authentication.JwtBearer;
2022-09-05 22:04:34 +02:00
using Microsoft.AspNetCore.Builder;
2020-08-09 01:31:16 +02:00
using Microsoft.AspNetCore.Hosting;
2022-09-06 01:41:46 +02:00
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
2020-08-09 01:31:16 +02:00
using Microsoft.Extensions.Hosting;
2022-09-05 22:04:34 +02:00
using Microsoft.Extensions.Logging;
2022-09-06 01:41:46 +02:00
using Microsoft.Identity.Web;
using Microsoft.IdentityModel.Logging;
using System;
2022-09-13 05:06:37 +02:00
using System.Collections.Generic;
2022-09-06 01:41:46 +02:00
using System.Linq;
2022-09-09 07:31:24 +02:00
using System.Net.Http.Headers;
2022-09-06 01:41:46 +02:00
using System.Threading.Tasks;
2020-08-09 01:31:16 +02:00
public class Program
{
2022-09-13 05:06:37 +02:00
private static readonly List<Module> AdditionalRegistrationModules = new();
public static void Main(string[] args)
{
2022-09-06 01:41:46 +02:00
var builder = WebApplication.CreateBuilder(args);
2022-09-09 07:31:24 +02:00
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer<ContainerBuilder>((containerBuilder) => ConfigureAutofacServices(containerBuilder, builder.Configuration));
2022-09-13 05:06:37 +02:00
ConfigureServices(builder);
2022-09-09 07:31:24 +02:00
var app = builder
.Build();
2022-09-06 01:41:46 +02:00
ConfigureApplication(app, app.Environment);
app.Run();
}
2022-09-13 05:06:37 +02:00
public static void AddAdditionalRegistrations(IList<Module> modules)
{
// Hack: ConfigureTestServices doesn't work with Autofac containers in .NET 6.
// Add test registrations to a static list, to be registered last.
AdditionalRegistrationModules.AddRange(modules);
}
2022-09-06 01:41:46 +02:00
private static void ConfigureServices(WebApplicationBuilder builder)
{
var services = builder.Services;
services.AddControllers();
services.AddApiVersioning(config =>
{
config.DefaultApiVersion = new ApiVersion(1, 0);
config.AssumeDefaultVersionWhenUnspecified = true;
});
services.AddOpenApiDocument();
services.AddApplicationInsightsTelemetry();
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(options =>
{
builder.Configuration.Bind("AzureAd", options);
options.Events = new JwtBearerEvents();
options.Events.OnAuthenticationFailed = async context =>
{
await Task.CompletedTask;
};
options.Events.OnForbidden = async context =>
{
await Task.CompletedTask;
};
options.Events.OnChallenge = async context =>
{
await Task.CompletedTask;
};
options.Events.OnTokenValidated = async context =>
{
string[] allowedClientApps = builder.Configuration.GetValue<string>("AllowedClientIds").Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
string clientAppId = context?.Principal?.Claims
.FirstOrDefault(x => x.Type == "azp" || x.Type == "appid")?.Value;
if (clientAppId == null || !allowedClientApps.Contains(clientAppId))
{
throw new UnauthorizedAccessException("The client app is not permitted to access this API");
}
await Task.CompletedTask;
};
}, options =>
{
builder.Configuration.Bind("AzureAd", options);
});
services.AddHttpContextAccessor();
services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();
IMapper mapper = Services.Mapper.GetMapper();
services.AddSingleton(mapper);
2022-09-06 06:53:54 +02:00
services.AddHealthChecks();
2022-09-09 07:31:24 +02:00
RegisterHttpClients(services, builder.Configuration);
RegisterHostedServices(services);
2022-09-06 01:41:46 +02:00
builder.Logging.AddEventSourceLogger();
2022-09-06 06:53:54 +02:00
builder.Logging.AddApplicationInsights();
}
2022-09-09 07:31:24 +02:00
private static void ConfigureAutofacServices(ContainerBuilder containerBuilder, IConfiguration configuration)
{
containerBuilder.RegisterModule(new ServicesModule(configuration));
2022-09-13 05:06:37 +02:00
foreach (var module in AdditionalRegistrationModules)
{
containerBuilder.RegisterModule(module);
}
2022-09-09 07:31:24 +02:00
}
private static void RegisterHttpClients(IServiceCollection services, IConfiguration configuration)
{
services.AddHttpClient("Sentry", c =>
{
c.BaseAddress = new Uri(configuration["SentryBaseUri"]);
string sentryAuthenticationToken = configuration["SentryAuthenticationToken"];
c.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", sentryAuthenticationToken);
});
}
private static void RegisterHostedServices(IServiceCollection services)
{
services.AddHostedService<ServerRegistryCleanupService>();
}
2022-09-06 01:41:46 +02:00
private static void ConfigureApplication(WebApplication app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
2022-09-06 06:53:54 +02:00
IdentityModelEventSource.ShowPII = true;
2022-09-06 01:41:46 +02:00
app.UseDeveloperExceptionPage();
app.UseOpenApi();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
2022-09-06 06:53:54 +02:00
app.MapHealthChecks("/health");
2022-09-06 01:41:46 +02:00
}
}
}