From f081a59229cb034f62368ac834e247cbf74c54f1 Mon Sep 17 00:00:00 2001 From: James Tombleson Date: Thu, 6 Jul 2023 22:22:55 -0700 Subject: [PATCH] startup was updated to inject ef, tables, jwt, and update swagger with bearer token auth --- Newsbot.Collector.Api/Program.cs | 113 ++++++++++++++++++++++++++----- 1 file changed, 96 insertions(+), 17 deletions(-) diff --git a/Newsbot.Collector.Api/Program.cs b/Newsbot.Collector.Api/Program.cs index 9dad4cf..ee12181 100644 --- a/Newsbot.Collector.Api/Program.cs +++ b/Newsbot.Collector.Api/Program.cs @@ -1,14 +1,24 @@ +using System.Text; using Hangfire; using Hangfire.MemoryStorage; using HealthChecks.UI.Client; +using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Diagnostics.HealthChecks; +using Microsoft.AspNetCore.Identity; +using Microsoft.EntityFrameworkCore; +using Microsoft.IdentityModel.Tokens; using Microsoft.OpenApi.Models; using Newsbot.Collector.Api; using Newsbot.Collector.Api.Authentication; +using Newsbot.Collector.Api.Services; using Newsbot.Collector.Database; +using Newsbot.Collector.Database.Repositories; using Newsbot.Collector.Domain.Consts; +using Newsbot.Collector.Domain.Entities; +using Newsbot.Collector.Domain.Interfaces; using Newsbot.Collector.Domain.Models; using Newsbot.Collector.Domain.Models.Config; +using Newsbot.Collector.Domain.Models.Config.Sources; using Serilog; using Serilog.Events; using ILogger = Serilog.ILogger; @@ -23,30 +33,76 @@ var config = GetConfiguration(); builder.Configuration.AddConfiguration(config); Log.Logger = GetLogger(config); - Log.Information("Starting up"); + +// configure Entity Framework +var dbconn = config.GetConnectionString("Database"); +builder.Services.AddDbContext(o => o.UseNpgsql(dbconn ?? "")); + +builder.Services.AddIdentity() + .AddRoles() + .AddEntityFrameworkStores(); + +builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); + +// Configure Identity +builder.Services.AddScoped(); + // Configure Hangfire builder.Services.AddHangfire(f => f.UseMemoryStorage()); builder.Services.AddHangfireServer(); GlobalConfiguration.Configuration.UseSerilogLogProvider(); +// Add Health Checks builder.Services.AddHealthChecks() .AddNpgSql(config.GetValue(ConfigConnectionStringConst.Database) ?? ""); + builder.Services.AddControllers(); + // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); builder.Services.Configure(config.GetSection("ConnectionStrings")); - builder.Services.Configure(config.GetSection(ConfigSectionsConst.ConnectionStrings)); builder.Services.Configure(config.GetSection(ConfigSectionsConst.Rss)); builder.Services.Configure(config.GetSection(ConfigSectionsConst.Youtube)); //builder.Services.Configure< +// Configure JWT for auth +var jwtSettings = new JwtSettings(); +config.Bind(nameof(jwtSettings), jwtSettings); +builder.Services.AddSingleton(jwtSettings); + + +builder.Services.AddAuthentication(x => +{ + x.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; + x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; + x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; +}).AddJwtBearer(x => +{ + x.SaveToken = true; + x.TokenValidationParameters = new TokenValidationParameters + { + ValidateIssuerSigningKey = true, + IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(jwtSettings.Secret ?? "")), + ValidateIssuer = false, + ValidateAudience = false, + RequireExpirationTime = false, + ValidateLifetime = true + }; +}); + builder.Services.AddSwaggerGen(cfg => { + cfg.AddSecurityDefinition("ApiKey", new OpenApiSecurityScheme { Description = "The API key to access the API", @@ -56,23 +112,45 @@ builder.Services.AddSwaggerGen(cfg => Scheme = "ApiKeyScheme" }); - var scheme = new OpenApiSecurityScheme + cfg.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { - Reference = new OpenApiReference - { - Type = ReferenceType.SecurityScheme, - Id = "ApiKey" - }, - In = ParameterLocation.Header - }; - var requirement = new OpenApiSecurityRequirement + Description = "JWT Authorization Header using the bearer scheme", + Name = "Authorization", + In = ParameterLocation.Header, + Type = SecuritySchemeType.ApiKey + }); + + cfg.AddSecurityRequirement(new OpenApiSecurityRequirement { - { scheme, new List() } - }; - cfg.AddSecurityRequirement(requirement); + //{ + // new OpenApiSecurityScheme + // { + // Reference = new OpenApiReference + // { + // Type = ReferenceType.SecurityScheme, + // Id = "ApiKey" + // }, + // In = ParameterLocation.Header + // }, + // new List() + //}, + { + new OpenApiSecurityScheme + { + Reference = new OpenApiReference + { + Type = ReferenceType.SecurityScheme, + Id = "Bearer" + }, + Scheme = "oauth2", + Name = "Bearer", + In = ParameterLocation.Header + }, + new List() + } + }); }); -builder.Services.AddDbContext(); var app = builder.Build(); @@ -88,9 +166,10 @@ app.UseHttpsRedirection(); app.UseHangfireDashboard(); BackgroundJobs.SetupRecurringJobs(config); -app.UseAuthorization(); +//app.UseAuthorization(); +app.UseAuthentication(); -app.UseMiddleware(); +//app.UseMiddleware(); app.MapHealthChecks("/health", new HealthCheckOptions {