兼容现有 PBKDF2 密码和 hz_session Cookie TOTP 绑定、二步登录、防重放、恢复码与 AES-GCM 密钥 与 Node 完全一致的 Redis 键格式,可跨运行时共享会话 生产环境开启原生认证时强制要求 Redis 默认保持兼容代理;设置 AUTH_NATIVE_ENABLED=true 即可切换
49 lines
2.0 KiB
C#
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);
|
|
}
|
|
}
|