feat(auth): replace TOTP with phone-first login

This commit is contained in:
2026-07-28 17:39:29 +08:00
parent e7d350ec3d
commit c7f9a4e3c9
43 changed files with 18386 additions and 882 deletions

View File

@@ -5,6 +5,7 @@ using Microsoft.Extensions.DependencyInjection;
using Tiku.Application.Security;
using Tiku.Domain.Identity;
using Tiku.Infrastructure.Bootstrap;
using Tiku.Infrastructure.Auth;
using Tiku.Infrastructure.Persistence;
namespace Tiku.UnitTests.Bootstrap;
@@ -28,7 +29,6 @@ public sealed class PlatformAdminBootstrapperTests
var context = scope.ServiceProvider.GetRequiredService<TikuDbContext>();
var user = await context.Users.SingleAsync(item => item.Id == result.UserId);
Assert.True(user.ForcePasswordChange);
Assert.False(user.TwoFactorEnabled);
Assert.True(user.EmailConfirmed);
Assert.Equal(UserStatus.Active, user.Status);
var role = await context.PlatformBackendRoles.SingleAsync(item => item.Id == result.RoleId);
@@ -97,7 +97,6 @@ public sealed class PlatformAdminBootstrapperTests
var user = await context.Users.SingleAsync();
Assert.Equal(DevelopmentPlatformAdminSeeder.Email, user.Email);
Assert.True(user.ForcePasswordChange);
Assert.False(user.TwoFactorEnabled);
Assert.Equal(BackendPermissions.Platform.Count, await context.PlatformBackendRolePermissions.CountAsync());
Assert.Single(context.PlatformBackendUserRoles);
Assert.Single(context.AuditLogs);
@@ -127,14 +126,15 @@ public sealed class PlatformAdminBootstrapperTests
options.UseInMemoryDatabase(Guid.NewGuid().ToString()));
services.AddIdentityCore<User>(options =>
{
options.Password.RequiredLength = 10;
options.Password.RequireDigit = true;
options.Password.RequireLowercase = true;
options.Password.RequiredLength = 8;
options.Password.RequireDigit = false;
options.Password.RequireLowercase = false;
options.Password.RequireUppercase = false;
options.Password.RequireNonAlphanumeric = false;
})
.AddEntityFrameworkStores<TikuDbContext>()
.AddDefaultTokenProviders();
.AddDefaultTokenProviders()
.AddPasswordValidator<LetterAndDigitPasswordValidator<User>>();
services.AddDataProtection().UseEphemeralDataProtectionProvider();
return services.BuildServiceProvider();
}