Merge branch 'main' into feature-worker

# Conflicts:
#	dotnet/AipsWebApi/Controllers/UserController.cs
This commit is contained in:
2026-02-15 16:23:04 +01:00
34 changed files with 940 additions and 30 deletions

View File

@@ -13,6 +13,7 @@ public static class ConfigurationEnvExtensions
private const string JwtAudience = "JWT_AUDIENCE";
private const string JwtKey = "JWT_KEY";
private const string JwtExpirationMinutes = "JWT_EXPIRATION_MINUTES";
private const string JwtRefreshExpirationDays = "JWT_REFRESH_TOKEN_EXPIRATION_DAYS";
extension(IConfiguration configuration)
{
@@ -51,6 +52,11 @@ public static class ConfigurationEnvExtensions
return configuration.GetEnvInt(configuration.GetEnvOrDefault(JwtExpirationMinutes, "60"));
}
public int GetEnvJwtRefreshExpirationDays()
{
return configuration.GetEnvInt(configuration.GetEnvOrDefault(JwtRefreshExpirationDays, "7"));
}
private string GetEnvForSure(string key)
{
var value = configuration[key];

View File

@@ -1,3 +1,4 @@
using AipsCore.Application.Abstract.UserContext;
using AipsCore.Domain.Abstract;
using AipsCore.Domain.Models.Shape.External;
using AipsCore.Domain.Models.User.External;
@@ -5,6 +6,7 @@ using AipsCore.Domain.Models.Whiteboard.External;
using AipsCore.Domain.Models.WhiteboardMembership.External;
using AipsCore.Infrastructure.DI.Configuration;
using AipsCore.Infrastructure.Persistence.Db;
using AipsCore.Infrastructure.Persistence.RefreshToken;
using AipsCore.Infrastructure.Persistence.Shape;
using AipsCore.Infrastructure.Persistence.User;
using AipsCore.Infrastructure.Persistence.Whiteboard;
@@ -28,10 +30,13 @@ public static class PersistenceRegistrationExtensions
});
services.AddTransient<IUnitOfWork, EfUnitOfWork>();
services.AddTransient<IUserRepository, UserRepository>();
services.AddTransient<IWhiteboardRepository, WhiteboardRepository>();
services.AddTransient<IWhiteboardMembershipRepository, WhiteboardMembershipRepository>();
services.AddTransient<IShapeRepository, ShapeRepository>();
services.AddTransient<IRefreshTokenManager, RefreshTokenManager>();
return services;
}

View File

@@ -1,16 +0,0 @@
using AipsCore.Infrastructure.Persistence.Db;
using Microsoft.Extensions.DependencyInjection;
namespace AipsCore.Infrastructure.DI;
public static class StartupExtensions
{
public static async Task InitializeInfrastructureAsync(this IServiceProvider services)
{
using var scope = services.CreateScope();
var serviceProvider = scope.ServiceProvider;
await DbInitializer.SeedRolesAsync(serviceProvider);
}
}

View File

@@ -2,8 +2,10 @@ using System.Text;
using AipsCore.Application.Abstract.UserContext;
using AipsCore.Application.Common.Authentication;
using AipsCore.Domain.Models.User.Options;
using AipsCore.Infrastructure.Authentication.AuthService;
using AipsCore.Infrastructure.Authentication.Jwt;
using AipsCore.Infrastructure.Authentication.UserContext;
using AipsCore.Infrastructure.DI.Configuration;
using AipsCore.Infrastructure.Persistence.Authentication;
using AipsCore.Infrastructure.Persistence.Db;
using AipsCore.Infrastructure.Persistence.User;
using Microsoft.AspNetCore.Authentication.JwtBearer;
@@ -23,7 +25,8 @@ public static class UserContextRegistrationExtension
Issuer = configuration.GetEnvJwtIssuer(),
Audience = configuration.GetEnvJwtAudience(),
Key = configuration.GetEnvJwtKey(),
ExpirationMinutes = configuration.GetEnvJwtExpirationMinutes()
ExpirationMinutes = configuration.GetEnvJwtExpirationMinutes(),
RefreshTokenExpirationDays = configuration.GetEnvJwtRefreshExpirationDays()
};
services.AddSingleton(jwtSettings);
@@ -50,6 +53,8 @@ public static class UserContextRegistrationExtension
{
options.TokenValidationParameters = new TokenValidationParameters
{
ClockSkew = TimeSpan.FromSeconds(30),
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,