Example #1
0
            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);
            }
Example #2
0
        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);
        }
Example #3
0
        /// <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);
        }