public async Task DeletesExpiredNonces() { var noncesToInsert = new[] { new Nonce(new KeyId("c1"), "abc001", _now.AddSeconds(_settings.ExpiredNoncesCleanUpInterval.TotalSeconds / 2 * -1)), new Nonce(new KeyId("c1"), "abc002", _now), new Nonce(new KeyId("c1"), "abc003", _now.AddSeconds(30)), new Nonce(new KeyId("c1"), "abc004", _now.AddMinutes(30)), new Nonce(new KeyId("c1"), "abc005", _now.AddSeconds(_settings.ExpiredNoncesCleanUpInterval.TotalSeconds * -1)), new Nonce(new KeyId("c1"), "abc006", _now.AddSeconds(_settings.ExpiredNoncesCleanUpInterval.TotalSeconds * -2)) }; var noopExpiredNonceCleaner = A.Fake <IExpiredNoncesCleaner>(); using (var nonceStore = new SqlServerNonceStore(_settings, noopExpiredNonceCleaner)) { foreach (var nonce in noncesToInsert) { await nonceStore.Register(nonce); } } var allNoncesBefore = await GetAllNonces(); allNoncesBefore.Should().BeEquivalentTo <Nonce>(noncesToInsert); await _sut.CleanUpNonces(); var allNoncesAfter = await GetAllNonces(); var expectedNonces = new[] { new Nonce(new KeyId("c1"), "abc003", _now.AddSeconds(30)), new Nonce(new KeyId("c1"), "abc004", _now.AddMinutes(30)), }; allNoncesAfter.Should().BeEquivalentTo <Nonce>(expectedNonces); }
public SqlServerNonceStoreTests(SqlServerFixture fixture) : base(fixture) { FakeFactory.Create(out _expiredNoncesCleaner); _settings = new SqlServerNonceStoreSettings { ExpiredNoncesCleanUpInterval = TimeSpan.FromMinutes(1), ConnectionString = fixture.SqlServerConfig.GetConnectionStringForTestDatabase() }; _sut = new SqlServerNonceStore(_settings, _expiredNoncesCleaner); _now = new DateTimeOffset( DateTimeOffset.UtcNow.Year, DateTimeOffset.UtcNow.Month, DateTimeOffset.UtcNow.Day, DateTimeOffset.UtcNow.Hour, DateTimeOffset.UtcNow.Minute, DateTimeOffset.UtcNow.Second, DateTimeOffset.UtcNow.Millisecond, TimeSpan.Zero); }
/// <summary>Configures HTTP message signature verification to use a SQL Server <see cref="INonceStore"/>.</summary> /// <param name="builder">The <see cref="IHttpMessageSigningVerificationBuilder" /> that is used to configure verification.</param> /// <param name="nonceStoreSettingsFactory">The factory that creates the settings for the SQL Server connection.</param> /// <returns>The <see cref="IHttpMessageSigningVerificationBuilder" /> that can be used to continue configuring the verification settings.</returns> public static IHttpMessageSigningVerificationBuilder UseSqlServerNonceStore( this IHttpMessageSigningVerificationBuilder builder, Func <IServiceProvider, SqlServerNonceStoreSettings> nonceStoreSettingsFactory) { if (builder == null) { throw new ArgumentNullException(nameof(builder)); } if (nonceStoreSettingsFactory == null) { throw new ArgumentNullException(nameof(nonceStoreSettingsFactory)); } builder.Services .AddMemoryCache() .AddSingleton(prov => { var sqlSettings = nonceStoreSettingsFactory(prov); if (sqlSettings == null) { throw new ValidationException($"Invalid {nameof(SqlServerNonceStoreSettings)} were specified."); } sqlSettings.Validate(); return(sqlSettings); }) .AddSingleton <IExpiredNoncesCleaner>(prov => new ExpiredNoncesCleaner( prov.GetRequiredService <SqlServerNonceStoreSettings>(), prov.GetRequiredService <IBackgroundTaskStarter>(), prov.GetRequiredService <ISystemClock>())) .AddSingleton(prov => { var decorator = prov.GetRequiredService <ICachingNonceStoreDecorator>(); var store = new SqlServerNonceStore( prov.GetRequiredService <SqlServerNonceStoreSettings>(), prov.GetRequiredService <IExpiredNoncesCleaner>()); return(decorator.DecorateWithCaching(store)); }); return(builder); }