using System; using System.Collections.Generic; using System.Text; using BlazorShared; using BlazorShared.Models; using MediatR; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Identity; using Microsoft.eShopWeb; using Microsoft.eShopWeb.ApplicationCore.Constants; using Microsoft.eShopWeb.ApplicationCore.Interfaces; using Microsoft.eShopWeb.ApplicationCore.Services; using Microsoft.eShopWeb.Infrastructure.Data; using Microsoft.eShopWeb.Infrastructure.Identity; using Microsoft.eShopWeb.Infrastructure.Logging; using Microsoft.eShopWeb.PublicApi; using Microsoft.eShopWeb.PublicApi.Middleware; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.IdentityModel.Tokens; using Microsoft.OpenApi.Models; using MinimalApi.Endpoint.Configurations.Extensions; using MinimalApi.Endpoint.Extensions; var builder = WebApplication.CreateBuilder(args); builder.Services.AddEndpoints(); // Use to force loading of appsettings.json of test project builder.Configuration.AddConfigurationFile("appsettings.test.json"); builder.Logging.AddConsole(); Microsoft.eShopWeb.Infrastructure.Dependencies.ConfigureServices(builder.Configuration, builder.Services); builder.Services.AddIdentity<ApplicationUser, IdentityRole>() .AddEntityFrameworkStores<AppIdentityDbContext>() .AddDefaultTokenProviders(); builder.Services.AddScoped(typeof(IRepository<>), typeof(EfRepository<>)); builder.Services.AddScoped(typeof(IReadRepository<>), typeof(EfRepository<>)); builder.Services.Configure<CatalogSettings>(builder.Configuration); builder.Services.AddSingleton<IUriComposer>(new UriComposer(builder.Configuration.Get<CatalogSettings>())); builder.Services.AddScoped(typeof(IAppLogger<>), typeof(LoggerAdapter<>)); builder.Services.AddScoped<ITokenClaimsService, IdentityTokenClaimService>(); var configSection = builder.Configuration.GetRequiredSection(BaseUrlConfiguration.CONFIG_NAME); builder.Services.Configure<BaseUrlConfiguration>(configSection); var baseUrlConfig = configSection.Get<BaseUrlConfiguration>(); builder.Services.AddMemoryCache(); var key = Encoding.ASCII.GetBytes(AuthorizationConstants.JWT_SECRET_KEY); builder.Services.AddAuthentication(config => { config.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(config => { config.RequireHttpsMetadata = false; config.SaveToken = true; config.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(key), ValidateIssuer = false, ValidateAudience = false }; }); const string CORS_POLICY = "CorsPolicy"; builder.Services.AddCors(options => { options.AddPolicy(name: CORS_POLICY, corsPolicyBuilder => { corsPolicyBuilder.WithOrigins(baseUrlConfig.WebBase.Replace("host.docker.internal", "localhost").TrimEnd('/')); corsPolicyBuilder.AllowAnyMethod(); corsPolicyBuilder.AllowAnyHeader(); }); }); builder.Services.AddControllers(); builder.Services.AddMediatR(typeof(CatalogItem).Assembly); builder.Services.AddAutoMapper(typeof(MappingProfile).Assembly); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" }); c.EnableAnnotations(); c.SchemaFilter<CustomSchemaFilters>(); c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { Description = @"JWT Authorization header using the Bearer scheme. \r\n\r\n Enter 'Bearer' [space] and then your token in the text input below. \r\n\r\nExample: 'Bearer 12345abcdef'", Name = "Authorization", In = ParameterLocation.Header, Type = SecuritySchemeType.ApiKey, Scheme = "Bearer" }); c.AddSecurityRequirement(new OpenApiSecurityRequirement() { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" }, Scheme = "oauth2", Name = "Bearer", In = ParameterLocation.Header, }, new List<string>() } }); }); var app = builder.Build(); app.Logger.LogInformation("PublicApi App created..."); app.Logger.LogInformation("Seeding Database..."); using (var scope = app.Services.CreateScope()) { var scopedProvider = scope.ServiceProvider; try { var catalogContext = scopedProvider.GetRequiredService<CatalogContext>(); await CatalogContextSeed.SeedAsync(catalogContext, app.Logger); var userManager = scopedProvider.GetRequiredService<UserManager<ApplicationUser>>(); var roleManager = scopedProvider.GetRequiredService<RoleManager<IdentityRole>>(); var identityContext = scopedProvider.GetRequiredService<AppIdentityDbContext>(); await AppIdentityDbContextSeed.SeedAsync(identityContext, userManager, roleManager); } catch (Exception ex) { app.Logger.LogError(ex, "An error occurred seeding the DB."); } } if (app.Environment.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseMiddleware<ExceptionMiddleware>(); app.UseHttpsRedirection(); app.UseRouting(); app.UseCors(CORS_POLICY); app.UseAuthorization(); // Enable middleware to serve generated Swagger as a JSON endpoint. app.UseSwagger(); // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.), // specifying the Swagger JSON endpoint. app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); }); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); app.MapEndpoints(); app.Logger.LogInformation("LAUNCHING PublicApi"); app.Run(); public partial class Program { }