diff --git a/web/backend/Features/Features.Auth/DependencyInjection/FeaturesAuthServiceCollectionExtensions.cs b/web/backend/Features/Features.Auth/DependencyInjection/FeaturesAuthServiceCollectionExtensions.cs
index d4a27b7d..35681939 100644
--- a/web/backend/Features/Features.Auth/DependencyInjection/FeaturesAuthServiceCollectionExtensions.cs
+++ b/web/backend/Features/Features.Auth/DependencyInjection/FeaturesAuthServiceCollectionExtensions.cs
@@ -1,6 +1,8 @@
+using Features.Auth.Identity;
using Features.Auth.Repository;
using Features.Auth.Services;
using Infrastructure.PasswordHashing;
+using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.DependencyInjection;
namespace Features.Auth.DependencyInjection;
@@ -9,14 +11,43 @@ namespace Features.Auth.DependencyInjection;
public static class FeaturesAuthServiceCollectionExtensions
{
///
- /// Adds , , and the Argon2 password hashing
- /// infrastructure as scoped services.
+ /// Adds , , the Argon2 password hashing
+ /// infrastructure, and ASP.NET Core Identity ( backed by
+ /// ) as scoped services.
///
public static IServiceCollection AddFeaturesAuth(this IServiceCollection services)
{
services.AddScoped();
services.AddScoped();
services.AddScoped();
+
+ services
+ .AddIdentityCore(options =>
+ {
+ options.User.RequireUniqueEmail = true;
+
+ // Password/username complexity is already enforced by RegisterUserValidator
+ // (FluentValidation); disable Identity's own checks to avoid duplicated/drifting rules.
+ options.Password.RequireDigit = false;
+ options.Password.RequireLowercase = false;
+ options.Password.RequireUppercase = false;
+ options.Password.RequireNonAlphanumeric = false;
+ options.Password.RequiredLength = 1;
+ })
+ .AddDefaultTokenProviders();
+
+ services.AddScoped();
+ services.AddScoped>(sp =>
+ sp.GetRequiredService()
+ );
+ services.AddScoped>(sp =>
+ sp.GetRequiredService()
+ );
+ services.AddScoped>(sp =>
+ sp.GetRequiredService()
+ );
+ services.AddScoped, Argon2PasswordHasher>();
+
return services;
}
}