Files
biss ae472aabb0 自主注册、登录、退出、当前用户与密码修改
兼容现有 PBKDF2 密码和 hz_session Cookie
TOTP 绑定、二步登录、防重放、恢复码与 AES-GCM 密钥
与 Node 完全一致的 Redis 键格式,可跨运行时共享会话
生产环境开启原生认证时强制要求 Redis
默认保持兼容代理;设置 AUTH_NATIVE_ENABLED=true 即可切换
2026-07-22 19:34:11 +08:00

49 lines
2.0 KiB
C#

using Eis.Infrastructure.Authentication;
namespace Eis.Infrastructure.Tests.Authentication;
public sealed class AuthenticationStateStoreTests
{
[Fact]
public async Task MemoryStoreHandlesSessionsChallengesAndTotpSetups()
{
var options = AuthenticationOptions.CreateForTests("test-only-totp-encryption-key-32-characters");
var state = new MemoryAuthenticationStateStore(options);
await state.CreateSessionAsync("session-1", "user-1");
await state.CreateSessionAsync("session-2", "user-1");
Assert.Equal("user-1", await state.GetSessionUserIdAsync("session-1"));
await state.CreateLoginChallengeAsync("challenge-1", "user-1");
for (var attempt = 1; attempt <= 5; attempt++)
{
var failure = await state.RecordLoginChallengeFailureAsync("challenge-1", 5);
Assert.Equal(attempt, failure?.Attempts);
}
Assert.Null(await state.GetLoginChallengeAsync("challenge-1"));
await state.CreateTotpSetupAsync("session-1", "user-1", "SECRET");
Assert.Equal(new TotpSetup("user-1", "SECRET"), await state.GetTotpSetupAsync("session-1"));
await state.DeleteTotpSetupAsync("session-1");
Assert.Null(await state.GetTotpSetupAsync("session-1"));
Assert.Equal(2, await state.DeleteUserSessionsAsync("user-1"));
Assert.Null(await state.GetSessionUserIdAsync("session-1"));
Assert.Null(await state.GetSessionUserIdAsync("session-2"));
}
[Fact]
public void RedisUrlMapsCredentialsTlsAndEndpoint()
{
var configuration = RedisAuthenticationStateStore.BuildConfiguration(
"rediss://session-user:p%40ss@example.test:6380/4");
var endpoint = Assert.Single(configuration.EndPoints);
Assert.Equal("Unspecified/example.test:6380", endpoint.ToString());
Assert.True(configuration.Ssl);
Assert.Equal("example.test", configuration.SslHost);
Assert.Equal("session-user", configuration.User);
Assert.Equal("p@ss", configuration.Password);
}
}