/
Kovalenko
/
TODO
Обзор
Документация
Войти
/
Kovalenko
/
TODO
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
TaskApi/Program.cs
135 строк
5 KB
Kovalenko1
pag
07 мар 2026, 13:46
07 мар 2026, 13:46
18fca63
Код
Авторство
О чём код?
using System.Text; using System.Text.Json.Serialization; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Tokens; using Microsoft.OpenApi.Models; using TaskApi.Data; using TaskApi.Middleware; using TaskApi.Models; using TaskApi.Services; using TaskApi.Swagger; var builder = WebApplication.CreateBuilder(args); builder.Services.AddDbContext<AppDbContext>(options => options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection"))); builder.Services.Configure<JwtOptions>(builder.Configuration.GetSection("Jwt")); builder.Services.Configure<RateLimitOptions>(builder.Configuration.GetSection("RateLimiting")); builder.Services.Configure<InternalApiOptions>(builder.Configuration.GetSection("InternalApi")); builder.Services.AddSingleton<JwtTokenService>(); builder.Services.AddSingleton<PasswordHasher<User>>(); builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { var jwt = builder.Configuration.GetSection("Jwt").Get<JwtOptions>() ?? new JwtOptions(); options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidIssuer = jwt.Issuer, ValidateAudience = true, ValidAudience = jwt.Audience, ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwt.Key)), ValidateLifetime = true, ClockSkew = TimeSpan.FromMinutes(1) }; }); builder.Services.AddAuthorization(); builder.Services.AddCors(options => { options.AddPolicy("frontend", policy => { var origins = builder.Configuration.GetSection("Cors:AllowedOrigins").Get<string[]>(); if (origins is { Length: > 0 }) { policy.WithOrigins(origins) .AllowAnyHeader() .AllowAnyMethod() .WithExposedHeaders("X-Total-Count", "X-Page", "X-Page-Size", "X-Total-Pages"); } else { policy.AllowAnyOrigin() .AllowAnyHeader() .AllowAnyMethod() .WithExposedHeaders("X-Total-Count", "X-Page", "X-Page-Size", "X-Total-Pages"); } }); }); builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); }); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(options => { options.SwaggerDoc("v1", new OpenApiInfo { Title = "Task API v1", Version = "v1" }); options.SwaggerDoc("v2", new OpenApiInfo { Title = "Task API v2", Version = "v2" }); options.SwaggerDoc("internal", new OpenApiInfo { Title = "Task API internal", Version = "internal" }); options.DocInclusionPredicate((docName, apiDesc) => string.Equals(apiDesc.GroupName, docName, StringComparison.OrdinalIgnoreCase)); var securityScheme = new OpenApiSecurityScheme { Name = "Authorization", Type = SecuritySchemeType.Http, Scheme = "bearer", BearerFormat = "JWT", In = ParameterLocation.Header, Description = "JWT Authorization header using the Bearer scheme.", Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } }; options.AddSecurityDefinition("Bearer", securityScheme); options.AddSecurityDefinition("InternalApiKey", new OpenApiSecurityScheme { Name = "X-Internal-Api-Key", Type = SecuritySchemeType.ApiKey, In = ParameterLocation.Header, Description = "Internal API key for internal endpoints." }); options.OperationFilter<AuthorizeOperationFilter>(); options.OperationFilter<InternalApiKeyOperationFilter>(); options.OperationFilter<PaginationHeadersOperationFilter>(); }); var app = builder.Build(); using (var scope = app.Services.CreateScope()) { var db = scope.ServiceProvider.GetRequiredService<AppDbContext>(); app.Logger.LogInformation("Applying database migrations..."); db.Database.Migrate(); app.Logger.LogInformation("Database migrations applied."); } app.UseSwagger(); app.UseSwaggerUI(options => { options.SwaggerEndpoint("/swagger/v1/swagger.json", "Task API v1"); options.SwaggerEndpoint("/swagger/v2/swagger.json", "Task API v2"); options.SwaggerEndpoint("/swagger/internal/swagger.json", "Task API internal"); }); app.UseCors("frontend"); app.UseAuthentication(); app.UseMiddleware<InternalApiKeyMiddleware>(); app.UseMiddleware<RateLimitingMiddleware>(); app.UseAuthorization(); app.MapControllers(); app.Run();