/
va1eriy
/
taskwards
Обзор
Документация
Войти
/
va1eriy
/
taskwards
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Taskwards.Api/Program.cs
142 строки
5 KB
Valeriy Kokorev
feat: implement password reset functionality
08 фев 2026, 19:09
08 фев 2026, 19:09
7ee9481
Код
Авторство
О чём код?
using System.IdentityModel.Tokens.Jwt; using System.Text; using FastEndpoints; using FastEndpoints.Swagger; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Tokens; using Taskwards.Api.Features.Auth; using Taskwards.Api.Features.Auth.Settings; using Taskwards.Api.Infrastructure.Common; using Taskwards.Api.Infrastructure.Data; using Taskwards.Api.Infrastructure.Data.Entities; using Taskwards.Api.Infrastructure.Email; JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); JwtSecurityTokenHandler.DefaultMapInboundClaims = false; var builder = WebApplication.CreateBuilder(args); builder.Services.AddDbContext<TaskwardsDbContext>(options => options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection"))); builder.Services.AddMediatR(cfg => { cfg.RegisterServicesFromAssembly(typeof(Program).Assembly); }); // Настройка аутентификации, авторизации builder.Services.AddIdentity<User, IdentityRole<Guid>>(options => { // Настройки пароля options.Password.RequireDigit = true; options.Password.RequireLowercase = true; options.Password.RequireUppercase = true; options.Password.RequireNonAlphanumeric = false; options.Password.RequiredLength = 8; // Настройки пользователя options.User.RequireUniqueEmail = true; // Настройки блокировки options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(15); options.Lockout.MaxFailedAccessAttempts = 5; options.Lockout.AllowedForNewUsers = true; // Подтверждение email (можно включить позже) options.SignIn.RequireConfirmedEmail = false; options.SignIn.RequireConfirmedPhoneNumber = false; }) .AddEntityFrameworkStores<TaskwardsDbContext>() .AddDefaultTokenProviders(); // Настройка срока действия токена сброса пароля (30 минут) builder.Services.Configure<DataProtectionTokenProviderOptions>(options => { options.TokenLifespan = TimeSpan.FromMinutes(30); }); // Настройка JWT сервисов builder.Services.Configure<JwtSettings>( builder.Configuration.GetSection("JwtSettings")); builder.Services.AddScoped<IJwtTokenGenerator, JwtTokenGenerator>(); builder.Services.AddScoped<IRefreshTokenService, RefreshTokenService>(); builder.Services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(options => { var jwtSettings = builder.Configuration.GetSection("JwtSettings").Get<JwtSettings>()!; options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = jwtSettings.Issuer, ValidAudience = jwtSettings.Audience, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.Secret)), RoleClaimType = "role", NameClaimType = "name", }; }); builder.Services.AddAuthorization(); // Настройка Email сервиса builder.Services.Configure<EmailSettings>(builder.Configuration.GetSection("EmailSettings")); builder.Services.AddScoped<IEmailService, EmailService>(); builder.Services.AddScoped<IEmailTemplateService, EmailTemplateService>(); // Настройка общих параметров приложения builder.Services.Configure<AppSettings>(builder.Configuration.GetSection("AppSettings")); builder.Services.AddFastEndpoints(); builder.Services.SwaggerDocument(o => { o.DocumentSettings = s => { s.Title = "Taskwards API"; s.Version = "v1"; s.Description = "API для приложения личной эффективности Taskwards"; }; }); builder.Services.AddCors(options => { options.AddPolicy("AllowBlazorWasm", policy => { policy.WithOrigins("https://localhost:7002") // URL Blazor WebAssembly .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials(); }); }); var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseHttpsRedirection(); app.UseCors("AllowBlazorWasm"); app.UseAuthentication(); app.UseAuthorization(); app.UseFastEndpoints(c => { c.Endpoints.RoutePrefix = "api"; }); app.UseSwaggerGen(); app.Run();