/
zykovad
/
PIR_Lab1_E-Library
Обзор
Документация
Войти
/
zykovad
/
PIR_Lab1_E-Library
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Program.cs
154 строки
4 KB
Darya
done lab 4
14 дек 2025, 21:50
14 дек 2025, 21:50
6680479
Код
Авторство
О чём код?
using libraryAPI.DataStorage.v1; using libraryAPI.RabbitMq; using libraryAPI.RabbitMq.Services; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.ApiExplorer; using Microsoft.IdentityModel.Tokens; using Microsoft.OpenApi.Models; using System.Text; using System.Threading.RateLimiting; var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddRateLimiter(options => { options.AddPolicy("UserPolicy", context => { var userId = context.User?.FindFirst("sub")?.Value ?? context.Connection.RemoteIpAddress?.ToString() ?? "anonymous"; return RateLimitPartition.GetFixedWindowLimiter( partitionKey: userId, factory: key => new FixedWindowRateLimiterOptions { PermitLimit = 5, Window = TimeSpan.FromSeconds(10), QueueProcessingOrder = QueueProcessingOrder.OldestFirst, QueueLimit = 0, AutoReplenishment = true } ); }); options.OnRejected = async (context, token) => { context.HttpContext.Response.StatusCode = 429; context.HttpContext.Response.Headers["X-Limit-Remaining"] = "0"; if (context.Lease.TryGetMetadata(MetadataName.RetryAfter, out var retryAfter)) { context.HttpContext.Response.Headers["Retry-After"] = retryAfter.TotalSeconds.ToString("F0"); } context.HttpContext.Response.ContentType = "application/json"; await context.HttpContext.Response.WriteAsync( "{\"error\": \"Rate limit exceeded. Try again later.\"}", token); }; }); builder.Services.AddApiVersioning(options => { options.DefaultApiVersion = new ApiVersion(1, 0); options.AssumeDefaultVersionWhenUnspecified = true; options.ReportApiVersions = true; }); builder.Services.AddVersionedApiExplorer(options => { options.GroupNameFormat = "'v'VVV"; options.SubstituteApiVersionInUrl = true; }); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(c => { c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { Description = "������� JWT ����� � �������: Bearer {your_token}", Name = "Authorization", In = ParameterLocation.Header, Type = SecuritySchemeType.ApiKey, Scheme = "Bearer" }); c.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } }, new string[] {} } }); c.EnableAnnotations(); }); builder.Services.ConfigureOptions<ConfigureSwaggerOptions>(); var jwtSettings = builder.Configuration.GetSection("Jwt"); var key = Encoding.ASCII.GetBytes(jwtSettings["Key"]); builder.Services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = jwtSettings["Issuer"], ValidAudience = jwtSettings["Audience"], IssuerSigningKey = new SymmetricSecurityKey(key) }; }); builder.Services.AddSingleton<libraryAPI.DataStorage.v1.Data>(); builder.Services.AddSingleton<libraryAPI.DataStorage.v2.Data>(); builder.Services.AddHostedService<RequestConsumer>(); builder.Services.AddSingleton<AuthorService>(); var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.UseSwagger(); var provider = app.Services.GetRequiredService<IApiVersionDescriptionProvider>(); app.UseSwaggerUI(options => { foreach (var description in provider.ApiVersionDescriptions) { options.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json", $"E-Library API {description.GroupName}"); } options.DisplayOperationId(); }); } app.UseHttpsRedirection(); app.UseAuthentication(); app.UseAuthorization(); app.UseRateLimiter(); app.MapControllers(); app.Run();