using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Authentication.OAuth; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Options; using Microsoft.IdentityModel.Tokens; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Models; using Npgsql; using OnlineMetodist.API.Data; using OnlineMetodist.API.Models; using OnlineMetodist.API.Services; using System.Text; using System.Text.Json.Serialization; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new DateOnlyJsonConverter()); }); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Logging.ClearProviders(); builder.Logging.AddConsole(); //на время разработки builder.Services.AddProblemDetails(); //swagger builder.Services.AddSwaggerGen(options => { options.SwaggerDoc("v1", new OpenApiInfo { Title = "OnlineMetodist API", Version = "v1", Description = "ASP.NET Core Web API для управления даными Онлайн Методиста" }); options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { In = ParameterLocation.Header, Description = "Please enter a valid token", Name = "Authorization", Type = SecuritySchemeType.Http, BearerFormat = "JWT", Scheme = "Bearer" }); options.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type=ReferenceType.SecurityScheme, Id="Bearer" } }, new List() } }); options.MapType(() => new OpenApiSchema { Type = "string", Format = "date", Example = new OpenApiString("2022-01-01") }); }); //Добавление БД builder.Services.AddDbContext(options => options.UseNpgsql( builder.Configuration.GetConnectionString("DefaultConnection"))); builder.Services.AddScoped(); //builder.Services.AddControllers().AddJsonOptions(opt => //{ // opt.JsonSerializerOptions.Converters.Add(new JsonConverter()); //}); //Добавление Identity для пользователей builder.Services.AddIdentity(options => { options.SignIn.RequireConfirmedAccount = false; options.Password.RequiredLength = 6; options.Password.RequireDigit = false; options.Password.RequireNonAlphanumeric = false; options.Password.RequireUppercase = false; options.User.RequireUniqueEmail = true; }) .AddRoles() //добавлени ролей? .AddEntityFrameworkStores(); //добавление ЕФ хранилища var validIssuer = builder.Configuration.GetValue("JwtTokenSettings:ValidIssuer"); var validAudience = builder.Configuration.GetValue("JwtTokenSettings:ValidAudience"); var symmetricSecurityKey = builder.Configuration.GetValue("JwtTokenSettings:SymmetricSecurityKey"); builder.Services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(options => { options.RequireHttpsMetadata = false; options.SaveToken = true; options.IncludeErrorDetails = true; options.TokenValidationParameters = new TokenValidationParameters() { ClockSkew = TimeSpan.Zero, ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = validIssuer, ValidAudience = validAudience, IssuerSigningKey = new SymmetricSecurityKey( Encoding.UTF8.GetBytes(symmetricSecurityKey) ), }; }); builder.Services.AddAuthorization(); var app = builder.Build(); //using (var scope = app.Services.CreateScope()) //{ // var services = scope.ServiceProvider; // SeedData.Initialize(services); //} using (var scope = app.Services.CreateScope()) { var services = scope.ServiceProvider; try { var userManager = services.GetRequiredService>(); var rolesManager = services.GetRequiredService>(); await SeedData.InitializeAsync(userManager, rolesManager); } catch (Exception ex) { var logger = services.GetRequiredService>(); logger.LogError(ex, "An error occurred while seeding the database."); } } // Configure the HTTP request pipeline. app.UseDeveloperExceptionPage(); app.UseSwagger(); app.UseSwaggerUI(options => { //options.SwaggerEndpoint("/swagger/v1/swagger.json", "v1"); //options.RoutePrefix = string.Empty; options.SwaggerEndpoint("./v1/swagger.json", "v1"); //Относительный путь до пользовательского интерфейса }); app.UseHttpsRedirection(); app.UseStatusCodePages(); app.UseAuthentication(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();