Skip to content

Commit

Permalink
Merge pull request #4 from damienbod/dev-updates
Browse files Browse the repository at this point in the history
Improve startup of projects
  • Loading branch information
damienbod committed Aug 13, 2023
2 parents 7dcf5fd + e2bee0b commit f1ce404
Show file tree
Hide file tree
Showing 25 changed files with 476 additions and 548 deletions.
Original file line number Diff line number Diff line change
@@ -1,26 +1,26 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.Authorization;
using Microsoft.Identity.Web;
using Microsoft.IdentityModel.Logging;
using Serilog;
using System.IdentityModel.Tokens.Jwt;

namespace WebApi;

public class Startup
internal static class HostingExtensions
{
public Startup(IConfiguration configuration)
private static IWebHostEnvironment? _env;
public static WebApplication ConfigureServices(this WebApplicationBuilder builder)
{
Configuration = configuration;
}

public IConfiguration Configuration { get; }
var services = builder.Services;
var configuration = builder.Configuration;
_env = builder.Environment;

public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(Consts.AAD_MULTI_SCHEME)
.AddMicrosoftIdentityWebApi(Configuration, "AzureADMultiApi", Consts.AAD_MULTI_SCHEME);
.AddMicrosoftIdentityWebApi(configuration, "AzureADMultiApi", Consts.AAD_MULTI_SCHEME);

services.AddAuthentication(Consts.AAD_SINGLE_SCHEME)
.AddMicrosoftIdentityWebApi(Configuration, "AzureADSingleApi", Consts.AAD_SINGLE_SCHEME);
.AddMicrosoftIdentityWebApi(configuration, "AzureADSingleApi", Consts.AAD_SINGLE_SCHEME);

services.AddAuthorization(policies =>
{
Expand All @@ -34,7 +34,7 @@ public void ConfigureServices(IServiceCollection services)
p.RequireClaim("azp", "967925d5-87ea-46e6-b0eb-1223c001fd77");
// client secret = 1, 2 if certificate is used
p.RequireClaim("azpacr", "1");
p.RequireClaim("azpacr", "1");
});
policies.AddPolicy(Consts.SINGLE_AAD_POLICY, p =>
Expand All @@ -56,14 +56,18 @@ public void ConfigureServices(IServiceCollection services)
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
});
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
return builder.Build();
}

public static WebApplication ConfigurePipeline(this WebApplication app)
{
IdentityModelEventSource.ShowPII = true;
//JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

if (env.IsDevelopment())
app.UseSerilogRequestLogging();

if (_env!.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
Expand All @@ -78,9 +82,8 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
app.UseAuthentication();
app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
app.MapControllers();

return app;
}
}
}
68 changes: 27 additions & 41 deletions AadMultiApis/MultiAADWebApi/Program.cs
Original file line number Diff line number Diff line change
@@ -1,48 +1,34 @@
using Serilog;
using Serilog.Events;
using Serilog.Sinks.SystemConsole.Themes;
using WebApi;

namespace WebApi;
Log.Logger = new LoggerConfiguration()
.WriteTo.Console()
.CreateBootstrapLogger();

public class Program
Log.Information("Starting up MultiAADWebApi");

try
{
public static int Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
var builder = WebApplication.CreateBuilder(args);

builder.Host.UseSerilog((ctx, lc) => lc
.WriteTo.Console(outputTemplate: "[{Timestamp:HH:mm:ss} {Level}] {SourceContext}{NewLine}{Message:lj}{NewLine}{Exception}{NewLine}")
.WriteTo.File("../_logs-MultiAADWebApi.txt")
.Enrich.FromLogContext()
.WriteTo.Console()
.CreateLogger();
.ReadFrom.Configuration(ctx.Configuration));

try
{
Log.Information("Starting web host");
CreateHostBuilder(args).Build().Run();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly");
return 1;
}
finally
{
Log.CloseAndFlush();
}
}
var app = builder
.ConfigureServices()
.ConfigurePipeline();

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog((hostingContext, loggerConfiguration) => loggerConfiguration
.ReadFrom.Configuration(hostingContext.Configuration)
.Enrich.FromLogContext()
.MinimumLevel.Verbose()
.WriteTo.File("../_logs-MultiAADWebApi.txt")
.WriteTo.Console(theme: AnsiConsoleTheme.Code)
)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
app.Run();
}
catch (Exception ex) when (ex.GetType().Name is not "StopTheHostException" && ex.GetType().Name is not "HostAbortedException")
{
Log.Fatal(ex, "Unhandled exception");
}
finally
{
Log.Information("Shut down complete");
Log.CloseAndFlush();
}
19 changes: 9 additions & 10 deletions AadMultiApis/MultiAADWebApi/appsettings.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"AzureADMultiApi": {
"Instance": "https://login.microsoftonline.com/",
"Instance": "https://login.microsoftonline.com/",
"Domain": "damienbodhotmail.onmicrosoft.com",
"TenantId": "7ff95b15-dc21-4ba6-bc92-824856578fc1",
//"ClientId": "b178f3a5-7588-492a-924f-72d7887b7e48" // test single application client cc
Expand All @@ -12,15 +12,14 @@
"TenantId": "7ff95b15-dc21-4ba6-bc92-824856578fc1",
"ClientId": "b2a09168-54e2-4bc4-af92-a710a64ef1fa"
},
"Logging": {
"Debug": {
"LogLevel": {
"Default": "Warning"
}
},
"Console": {
"LogLevel": {
"Default": "Warning"
"Serilog": {
"MinimumLevel": {
"Default": "Debug",
"Override": {
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information",
"Microsoft.AspNetCore.Authentication": "Debug",
"System": "Warning"
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,30 @@
using Microsoft.AspNetCore.Mvc.Authorization;
using Microsoft.Identity.Web;
using Microsoft.Identity.Web.UI;
using Microsoft.IdentityModel.Logging;
using Serilog;
using System.IdentityModel.Tokens.Jwt;

namespace RazorAzureAD;

public class Startup
internal static class HostingExtensions
{
public Startup(IConfiguration configuration)
private static IWebHostEnvironment? _env;
public static WebApplication ConfigureServices(this WebApplicationBuilder builder)
{
Configuration = configuration;
}

public IConfiguration Configuration { get; }
var services = builder.Services;
var configuration = builder.Configuration;
_env = builder.Environment;

public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<SingleTenantApiService>();
services.AddTransient<MultiTenantApplicationApiService>();
services.AddHttpClient();

services.AddOptions();

string[]? initialScopes = Configuration.GetValue<string>("AzureADSingleApi:ScopeForAccessToken")?.Split(' ');
string[]? initialScopes = configuration.GetValue<string>("AzureADSingleApi:ScopeForAccessToken")?.Split(' ');

services.AddMicrosoftIdentityWebAppAuthentication(Configuration)
services.AddMicrosoftIdentityWebAppAuthentication(configuration)
.EnableTokenAcquisitionToCallDownstreamApi(initialScopes)
.AddInMemoryTokenCaches();

Expand All @@ -35,21 +36,29 @@ public void ConfigureServices(IServiceCollection services)
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
}).AddMicrosoftIdentityUI();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
return builder.Build();
}

public static WebApplication ConfigurePipeline(this WebApplication app)
{
if (env.IsDevelopment())
IdentityModelEventSource.ShowPII = true;
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

app.UseSerilogRequestLogging();

if (_env!.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}

app.UseSecurityHeaders(
SecurityHeadersDefinitions.GetHeaderPolicyCollection(env.IsDevelopment()));
SecurityHeadersDefinitions.GetHeaderPolicyCollection(_env!.IsDevelopment()));

app.UseHttpsRedirection();
app.UseStaticFiles();
Expand All @@ -59,10 +68,9 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
app.UseAuthentication();
app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapControllers();
});
app.MapRazorPages();
app.MapControllers();

return app;
}
}
}
66 changes: 26 additions & 40 deletions AadMultiApis/TestMultiApis/Program.cs
Original file line number Diff line number Diff line change
@@ -1,48 +1,34 @@
using RazorAzureAD;
using Serilog;
using Serilog.Events;
using Serilog.Sinks.SystemConsole.Themes;

namespace RazorAzureAD;
Log.Logger = new LoggerConfiguration()
.WriteTo.Console()
.CreateBootstrapLogger();

public class Program
Log.Information("Starting up RazorAzureAD");

try
{
public static int Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
var builder = WebApplication.CreateBuilder(args);

builder.Host.UseSerilog((ctx, lc) => lc
.WriteTo.Console(outputTemplate: "[{Timestamp:HH:mm:ss} {Level}] {SourceContext}{NewLine}{Message:lj}{NewLine}{Exception}{NewLine}")
.WriteTo.File("../_logs-TestMultiApis.txt")
.Enrich.FromLogContext()
.WriteTo.Console()
.CreateLogger();
.ReadFrom.Configuration(ctx.Configuration));

try
{
Log.Information("Starting web host");
CreateHostBuilder(args).Build().Run();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly");
return 1;
}
finally
{
Log.CloseAndFlush();
}
}
var app = builder
.ConfigureServices()
.ConfigurePipeline();

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog((hostingContext, loggerConfiguration) => loggerConfiguration
.ReadFrom.Configuration(hostingContext.Configuration)
.Enrich.FromLogContext()
.MinimumLevel.Verbose()
.WriteTo.File("../_logs-TestMultiApis.txt")
.WriteTo.Console(theme: AnsiConsoleTheme.Code)
)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
app.Run();
}
catch (Exception ex) when (ex.GetType().Name is not "StopTheHostException" && ex.GetType().Name is not "HostAbortedException")
{
Log.Fatal(ex, "Unhandled exception");
}
finally
{
Log.Information("Shut down complete");
Log.CloseAndFlush();
}
14 changes: 9 additions & 5 deletions AadMultiApis/TestMultiApis/appsettings.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,15 @@
"Authority": "https://login.microsoftonline.com/7ff95b15-dc21-4ba6-bc92-824856578fc1",
"ApiBaseAddress": "https://localhost:44342"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
"Serilog": {
"MinimumLevel": {
"Default": "Debug",
"Override": {
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information",
"Microsoft.AspNetCore.Authentication": "Debug",
"System": "Warning"
}
}
},
"AllowedHosts": "*"
Expand Down
Loading

0 comments on commit f1ce404

Please sign in to comment.