From 3b5c7ce0e1f41c2a421df944c486e7f13fc2627e Mon Sep 17 00:00:00 2001 From: Nick Blakely Date: Mon, 5 Sep 2022 16:41:46 -0700 Subject: [PATCH] Use new-style web application builder. --- Giants.WebApi/Program.cs | 117 ++++++++++++++++++++++++++++++++++++--- Giants.WebApi/Startup.cs | 116 -------------------------------------- 2 files changed, 108 insertions(+), 125 deletions(-) delete mode 100644 Giants.WebApi/Startup.cs diff --git a/Giants.WebApi/Program.cs b/Giants.WebApi/Program.cs index 5d690da..e3ca1a4 100644 --- a/Giants.WebApi/Program.cs +++ b/Giants.WebApi/Program.cs @@ -1,24 +1,123 @@ namespace Giants.Web { + using AutoMapper; + using Giants.Services; + using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; + using Microsoft.AspNetCore.Mvc; + using Microsoft.AspNetCore.Mvc.Infrastructure; + using Microsoft.Extensions.Configuration; + using Microsoft.Extensions.DependencyInjection; + using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; + using Microsoft.Identity.Web; + using Microsoft.IdentityModel.Logging; + using System; + using System.Linq; + using System.Threading.Tasks; public class Program { public static void Main(string[] args) { - var builder = CreateHostBuilder(args); - builder.ConfigureLogging(x => x.AddEventSourceLogger()); - builder.Build().Run(); + var builder = WebApplication.CreateBuilder(args); + + ConfigureServices(builder); + + var app = builder.Build(); + ConfigureApplication(app, app.Environment); + + app.Run(); } - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }); + 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(); + + IdentityModelEventSource.ShowPII = true; + + 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("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(); + + ServicesModule.RegisterServices(services, builder.Configuration); + + IMapper mapper = Services.Mapper.GetMapper(); + services.AddSingleton(mapper); + + builder.Logging.AddEventSourceLogger(); + } + + private static void ConfigureApplication(WebApplication app, IWebHostEnvironment env) + { + if (env.IsDevelopment()) + { + Microsoft.IdentityModel.Logging.IdentityModelEventSource.ShowPII = true; + app.UseDeveloperExceptionPage(); + app.UseOpenApi(); + } + + app.UseHttpsRedirection(); + + app.UseRouting(); + + app.UseAuthentication(); + app.UseAuthorization(); + + + app.UseEndpoints(endpoints => + { + endpoints.MapControllers(); + }); + } } } diff --git a/Giants.WebApi/Startup.cs b/Giants.WebApi/Startup.cs deleted file mode 100644 index 767630b..0000000 --- a/Giants.WebApi/Startup.cs +++ /dev/null @@ -1,116 +0,0 @@ -using AutoMapper; -using Giants.Services; -using Microsoft.AspNetCore.Authentication.JwtBearer; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Infrastructure; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; -using Microsoft.Extensions.Hosting; -using Microsoft.Identity.Web; -using Microsoft.IdentityModel.Logging; -using System; -using System.IdentityModel.Tokens.Jwt; -using System.Linq; -using System.Threading.Tasks; - -namespace Giants.Web -{ - public class Startup - { - public Startup(IConfiguration configuration) - { - this.Configuration = configuration; - } - - public IConfiguration Configuration { get; } - - // This method gets called by the runtime. Use this method to add services to the container. - public void ConfigureServices(IServiceCollection services) - { - services.AddControllers(); - services.AddApiVersioning(config => - { - config.DefaultApiVersion = new ApiVersion(1, 0); - config.AssumeDefaultVersionWhenUnspecified = true; - }); - - services.AddOpenApiDocument(); - - services.AddApplicationInsightsTelemetry(); - - IdentityModelEventSource.ShowPII = true; - - services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) - .AddMicrosoftIdentityWebApi(options => - { - 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 = this.Configuration.GetValue("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 => - { - Configuration.Bind("AzureAd", options); - }); - - services.AddHttpContextAccessor(); - services.TryAddSingleton(); - - ServicesModule.RegisterServices(services, this.Configuration); - - IMapper mapper = Services.Mapper.GetMapper(); - services.AddSingleton(mapper); - } - - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - if (env.IsDevelopment()) - { - Microsoft.IdentityModel.Logging.IdentityModelEventSource.ShowPII = true; - app.UseDeveloperExceptionPage(); - app.UseOpenApi(); - } - - app.UseHttpsRedirection(); - - app.UseRouting(); - - app.UseAuthentication(); - app.UseAuthorization(); - - - app.UseEndpoints(endpoints => - { - endpoints.MapControllers(); - }); - } - } -}