/
nicteres
/
Lab1
Обзор
Документация
Войти
/
nicteres
/
Lab1
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
123
API_Lab_1/Program.cs
189 строк
5 KB
Matthew
Добавьте файлы проекта.
18 окт 2025, 18:03
18 окт 2025, 18:03
79e10ad
Код
Авторство
О чём код?
using API_Lab_1.src; using API_Lab_1.src.Interface; using API_Lab_1.src.Services; using Asp.Versioning; using Asp.Versioning.ApiExplorer; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.RateLimiting; using Microsoft.DotNet.Scaffolding.Shared; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Options; using Microsoft.IdentityModel.Tokens; using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.SwaggerGen; using System.Reflection; using System.Text; using System.Text.Json.Serialization; using System.Threading.RateLimiting; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); }); builder.Services.AddApiVersioning(options => { options.ReportApiVersions = true; options.AssumeDefaultVersionWhenUnspecified = true; options.DefaultApiVersion = new ApiVersion(1, 0); }).AddApiExplorer(options => { options.GroupNameFormat = "'v'VVV"; options.SubstituteApiVersionInUrl = true; }); builder.Services.AddCors(options => { options.AddPolicy("InternalOnly", policy => { policy.WithOrigins("https://localhost", "http://localhost") .AllowAnyHeader() .AllowAnyMethod(); }); }); // --- Swagger --- builder.Services.AddEndpointsApiExplorer(); builder.Services.AddTransient<IConfigureOptions<SwaggerGenOptions>, ConfigureSwaggerOptions>(); builder.Services.AddSwaggerGen(options => { options.EnableAnnotations(); // JWT Authentication setup options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { In = ParameterLocation.Header, Description = "Please enter JWT with Bearer into field", Name = "Authorization", Type = SecuritySchemeType.Http, Scheme = "bearer", BearerFormat = "JWT" }); options.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } }, new string[] {} } }); options.SwaggerDoc("v1", new OpenApiInfo { Version = "v1", Title = "API_Lab_1 v1" }); options.SwaggerDoc("v2", new OpenApiInfo { Version = "v2", Title = "API_Lab_1 v2" }); }); // Register Swagger docs dynamically for each discovered API version builder.Services.ConfigureOptions<ConfigureSwaggerOptions>(); // --- Custom Services --- builder.Services.AddScoped<IAuthService, AuthService>(); builder.Services.AddScoped<IAccessService, AccessService>(); builder.Services.AddScoped<IRequestService, RequestService>(); builder.Services.AddScoped<IShelfService, ShelfService>(); // --- Auth --- builder.Services.AddAuthorization(); builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidIssuer = AuthOptions.ISSUER, ValidateAudience = true, ValidAudience = AuthOptions.AUDIENCE, ValidateLifetime = true, ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(AuthOptions.KEY)), }; }); // --- Rate limiting --- builder.Services.AddRateLimiter(options => { options.RejectionStatusCode = StatusCodes.Status429TooManyRequests; options.AddFixedWindowLimiter(policyName: "fixedLimiter", limiterOptions => { limiterOptions.AutoReplenishment = true; limiterOptions.PermitLimit = 30; limiterOptions.Window = TimeSpan.FromMinutes(1); limiterOptions.QueueLimit = 10; }); options.AddConcurrencyLimiter(policyName: "concurrencyLimiter", limiterOptions => { limiterOptions.PermitLimit = 10; limiterOptions.QueueProcessingOrder = QueueProcessingOrder.OldestFirst; limiterOptions.QueueLimit = 5; }); }); // --- Database --- builder.Services.AddDbContext<AppDbContext>(); builder.Services.AddHttpClient(); var app = builder.Build(); var provider = app.Services.GetRequiredService<IApiVersionDescriptionProvider>(); // --- Pipeline --- if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(options => { options.SwaggerEndpoint("/swagger/v1/swagger.json", "v1"); options.SwaggerEndpoint("/swagger/v2/swagger.json", "v2"); options.RoutePrefix = string.Empty; }); } app.UseHttpsRedirection(); app.UseAuthorization(); app.UseMiddleware<RateLimitHeadersMiddleware>(); app.UseCors(); app.MapControllers(); app.MapGet("/routes", (IEnumerable<EndpointDataSource> endpointSources) => string.Join("\n", endpointSources.SelectMany(source => source.Endpoints))); app.Run(); // --- Swagger Options Helper --- public class ConfigureSwaggerOptions() : IConfigureOptions<SwaggerGenOptions> { public void Configure(SwaggerGenOptions options) { var added = new HashSet<string>(); } }