/// <summary>Configures HTTP message signature verification to use a SQL Server <see cref="IClientStore"/>.</summary>
        /// <param name="builder">The <see cref="IHttpMessageSigningVerificationBuilder" /> that is used to configure verification.</param>
        /// <param name="clientStoreSettingsFactory">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 UseSqlServerClientStore(
            this IHttpMessageSigningVerificationBuilder builder,
            Func <IServiceProvider, SqlServerClientStoreSettings> clientStoreSettingsFactory)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }
            if (clientStoreSettingsFactory == null)
            {
                throw new ArgumentNullException(nameof(clientStoreSettingsFactory));
            }

            builder.Services
            .AddMemoryCache()
            .AddSingleton <ISignatureAlgorithmConverter, SignatureAlgorithmConverter>()
            .AddSingleton(prov => {
                var settings = clientStoreSettingsFactory(prov);
                if (settings == null)
                {
                    throw new ValidationException($"Invalid {nameof(SqlServerClientStoreSettings)} were specified.");
                }
                settings.Validate();
                return(settings);
            });

            return(builder
                   // The actual store
                   .UseClientStore(prov => {
                var sqlSettings = prov.GetRequiredService <SqlServerClientStoreSettings>();
                var decorator = prov.GetRequiredService <ICachingClientStoreDecorator>();
                var store = new SqlServerClientStore(sqlSettings, prov.GetRequiredService <ISignatureAlgorithmConverter>());
                return decorator.DecorateWithCaching(store, sqlSettings.ClientCacheEntryExpiration);
            }));
        }
Пример #2
0
        /// <summary>Configures HTTP message signature verification to use a MongoDB <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 Mongo connection.</param>
        /// <returns>The <see cref="IHttpMessageSigningVerificationBuilder" /> that can be used to continue configuring the verification settings.</returns>
        public static IHttpMessageSigningVerificationBuilder UseMongoDbNonceStore(
            this IHttpMessageSigningVerificationBuilder builder,
            Func <IServiceProvider, MongoDbNonceStoreSettings> nonceStoreSettingsFactory)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }
            if (nonceStoreSettingsFactory == null)
            {
                throw new ArgumentNullException(nameof(nonceStoreSettingsFactory));
            }

            builder.Services
            .AddMemoryCache()
            .AddSingleton(prov => {
                var mongoSettings = nonceStoreSettingsFactory(prov);
                if (mongoSettings == null)
                {
                    throw new ValidationException($"Invalid {nameof(MongoDbNonceStoreSettings)} were specified.");
                }
                mongoSettings.Validate();
                var decorator = prov.GetRequiredService <ICachingNonceStoreDecorator>();
                var store     = new MongoDbNonceStore(
                    new MongoDatabaseClientProvider(mongoSettings.ConnectionString),
                    mongoSettings.CollectionName);
                return(decorator.DecorateWithCaching(store));
            });

            return(builder);
        }
Пример #3
0
        /// <summary>Configures HTTP message signature verification to use a MongoDB <see cref="IClientStore"/>.</summary>
        /// <param name="builder">The <see cref="IHttpMessageSigningVerificationBuilder" /> that is used to configure verification.</param>
        /// <param name="clientStoreSettingsFactory">The factory that creates the settings for the Mongo connection.</param>
        /// <returns>The <see cref="IHttpMessageSigningVerificationBuilder" /> that can be used to continue configuring the verification settings.</returns>
        public static IHttpMessageSigningVerificationBuilder UseMongoDbClientStore(
            this IHttpMessageSigningVerificationBuilder builder,
            Func <IServiceProvider, MongoDbClientStoreSettings> clientStoreSettingsFactory)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }
            if (clientStoreSettingsFactory == null)
            {
                throw new ArgumentNullException(nameof(clientStoreSettingsFactory));
            }

            builder.Services
            // Services
            .AddMemoryCache()
            .AddSingleton <ISystemClock, RealSystemClock>()
            .AddSingleton <IDelayer, Delayer>()
            .AddSingleton <IBackgroundTaskStarter, BackgroundTaskStarter>()
            .AddSingleton(prov => {
                var settings = clientStoreSettingsFactory(prov);
                if (settings == null)
                {
                    throw new ValidationException($"Invalid {nameof(MongoDbClientStoreSettings)} were specified.");
                }
                settings.Validate();
                return(settings);
            })
            .AddSingleton <IMongoDatabaseClientProvider>(prov => {
                var mongoSettings = prov.GetRequiredService <MongoDbClientStoreSettings>();
                return(new MongoDatabaseClientProvider(mongoSettings.ConnectionString));
            })

            // ClientStore Migrations
            .AddSingleton <IClientStoreBaseliner, ClientStoreBaseliner>()
            .AddSingleton <ISemaphoreFactory, SemaphoreFactory>()
            .AddSingleton <IClientStoreMigrator>(prov =>
                                                 new OnlyOnceClientStoreMigrator(
                                                     new ClientStoreMigrator(
                                                         prov.GetRequiredService <IEnumerable <IClientStoreMigrationStep> >(),
                                                         prov.GetRequiredService <IClientStoreBaseliner>()),
                                                     prov.GetRequiredService <IClientStoreBaseliner>(),
                                                     prov.GetRequiredService <ISemaphoreFactory>()))
            .AddSingleton <IClientStoreMigrationStep, AddEncryptionSupportToClientsMigrationStep>();

            return(builder
                   // The actual store
                   .UseClientStore(prov => {
                var mongoSettings = prov.GetRequiredService <MongoDbClientStoreSettings>();
                return new CachingMongoDbClientStore(
                    new MongoDbClientStore(
                        prov.GetRequiredService <IMongoDatabaseClientProvider>(),
                        mongoSettings.CollectionName,
                        mongoSettings.SharedSecretEncryptionKey,
                        prov.GetRequiredService <IClientStoreMigrator>()),
                    prov.GetRequiredService <IMemoryCache>(),
                    mongoSettings.ClientCacheEntryExpiration,
                    prov.GetRequiredService <IBackgroundTaskStarter>());
            }));
        }
Пример #4
0
        public static IHttpMessageSigningVerificationBuilder UseSignatureParser(this IHttpMessageSigningVerificationBuilder builder, ISignatureParser signatureParser)
        {
            if (signatureParser == null)
            {
                throw new ArgumentNullException(nameof(signatureParser));
            }

            return(builder.UseSignatureParser(provider => signatureParser));
        }
Пример #5
0
        public static IHttpMessageSigningVerificationBuilder UseAuthenticationHeaderExtractor(
            this IHttpMessageSigningVerificationBuilder builder,
            IAuthenticationHeaderExtractor authenticationHeaderExtractor)
        {
            if (authenticationHeaderExtractor == null)
            {
                throw new ArgumentNullException(nameof(authenticationHeaderExtractor));
            }

            return(builder.UseAuthenticationHeaderExtractor(provider => authenticationHeaderExtractor));
        }
Пример #6
0
        public static IHttpMessageSigningVerificationBuilder UseMongoDbNonceStore(this IHttpMessageSigningVerificationBuilder builder, MongoDbNonceStoreSettings nonceStoreSettings)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }
            if (nonceStoreSettings == null)
            {
                throw new ArgumentNullException(nameof(nonceStoreSettings));
            }

            return(builder.UseMongoDbNonceStore(prov => nonceStoreSettings));
        }
        public static IHttpMessageSigningVerificationBuilder UseSqlServerClientStore(this IHttpMessageSigningVerificationBuilder builder, SqlServerClientStoreSettings clientStoreSettings)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }
            if (clientStoreSettings == null)
            {
                throw new ArgumentNullException(nameof(clientStoreSettings));
            }

            return(builder.UseSqlServerClientStore(prov => clientStoreSettings));
        }
Пример #8
0
        public static IHttpMessageSigningVerificationBuilder UseSignatureParser(
            this IHttpMessageSigningVerificationBuilder builder,
            Func <IServiceProvider, ISignatureParser> signatureParserFactory)
        {
            if (signatureParserFactory == null)
            {
                throw new ArgumentNullException(nameof(signatureParserFactory));
            }

            builder.Services.AddSingleton(signatureParserFactory);

            return(builder);
        }
Пример #9
0
        public static IHttpMessageSigningVerificationBuilder UseAuthenticationHeaderExtractor(
            this IHttpMessageSigningVerificationBuilder builder,
            Func <IServiceProvider, IAuthenticationHeaderExtractor> authenticationHeaderExtractorFactory)
        {
            if (authenticationHeaderExtractorFactory == null)
            {
                throw new ArgumentNullException(nameof(authenticationHeaderExtractorFactory));
            }

            builder.Services.AddSingleton(authenticationHeaderExtractorFactory);

            return(builder);
        }
        /// <summary>Configures HTTP message signature verification to use a file system-backed <see cref="IClientStore"/>.</summary>
        /// <param name="builder">The <see cref="IHttpMessageSigningVerificationBuilder" /> that is used to configure verification.</param>
        /// <param name="clientStoreSettingsFactory">The factory that creates the settings for the file.</param>
        /// <returns>The <see cref="IHttpMessageSigningVerificationBuilder" /> that can be used to continue configuring the verification settings.</returns>
        public static IHttpMessageSigningVerificationBuilder UseFileSystemClientStore(
            this IHttpMessageSigningVerificationBuilder builder,
            Func <IServiceProvider, FileSystemClientStoreSettings> clientStoreSettingsFactory)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }
            if (clientStoreSettingsFactory == null)
            {
                throw new ArgumentNullException(nameof(clientStoreSettingsFactory));
            }

            builder.Services
            .AddMemoryCache()
            .AddSingleton <IFileReader, FileReader>()
            .AddSingleton <IFileWriter, FileWriter>()
            .AddSingleton <IClientDataRecordSerializer, ClientDataRecordSerializer>()
            .AddSingleton <ILockFactory, LockFactory>()
            .AddSingleton <ISignatureAlgorithmDataRecordConverter, SignatureAlgorithmDataRecordConverter>()
            .AddSingleton(prov => {
                var settings = clientStoreSettingsFactory(prov);
                if (settings == null)
                {
                    throw new ValidationException($"Invalid {nameof(FileSystemClientStoreSettings)} were specified.");
                }
                settings.Validate();
                return(settings);
            });

            return(builder
                   // The actual store
                   .UseClientStore(prov => {
                var settings = prov.GetRequiredService <FileSystemClientStoreSettings>();
                var decorator = prov.GetRequiredService <ICachingClientStoreDecorator>();
                var store = new LockingClientStore(
                    new FileSystemClientStore(
                        new ClientsFileManager(
                            prov.GetRequiredService <IFileReader>(),
                            prov.GetRequiredService <IFileWriter>(),
                            settings.FilePath,
                            prov.GetRequiredService <IClientDataRecordSerializer>()),
                        prov.GetRequiredService <ISignatureAlgorithmDataRecordConverter>(),
                        settings.SharedSecretEncryptionKey),
                    prov.GetRequiredService <ILockFactory>());
                return decorator.DecorateWithCaching(store, settings.ClientCacheEntryExpiration);
            }));
        }
        /// <summary>Configures HTTP message signature verification to use a file system-backed <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 file.</param>
        /// <returns>The <see cref="IHttpMessageSigningVerificationBuilder" /> that can be used to continue configuring the verification settings.</returns>
        public static IHttpMessageSigningVerificationBuilder UseFileSystemNonceStore(
            this IHttpMessageSigningVerificationBuilder builder,
            Func <IServiceProvider, FileSystemNonceStoreSettings> nonceStoreSettingsFactory)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }
            if (nonceStoreSettingsFactory == null)
            {
                throw new ArgumentNullException(nameof(nonceStoreSettingsFactory));
            }

            builder.Services
            .AddMemoryCache()
            .AddSingleton <IFileReader, FileReader>()
            .AddSingleton <IFileWriter, FileWriter>()
            .AddSingleton <INonceDataRecordSerializer, NonceDataRecordSerializer>()
            .AddSingleton <ILockFactory, LockFactory>()
            .AddSingleton(prov => {
                var settings = nonceStoreSettingsFactory(prov);
                if (settings == null)
                {
                    throw new ValidationException($"Invalid {nameof(FileSystemNonceStoreSettings)} were specified.");
                }
                settings.Validate();
                return(settings);
            })
            .AddSingleton(prov => {
                var settings  = prov.GetRequiredService <FileSystemNonceStoreSettings>();
                var decorator = prov.GetRequiredService <ICachingNonceStoreDecorator>();
                var store     = new LockingNonceStore(
                    new FileSystemNonceStore(
                        new NoncesFileManager(
                            prov.GetRequiredService <IFileReader>(),
                            prov.GetRequiredService <IFileWriter>(),
                            settings.FilePath,
                            prov.GetRequiredService <INonceDataRecordSerializer>()),
                        prov.GetRequiredService <ISystemClock>()),
                    prov.GetRequiredService <ILockFactory>());
                return(decorator.DecorateWithCaching(store));
            });

            return(builder);
        }
Пример #12
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);
        }
        public static IHttpMessageSigningVerificationBuilder UseAspNetCoreSignatureVerification(this IHttpMessageSigningVerificationBuilder builder)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            builder.Services
            .AddSingleton <ISignatureParser>(prov => new SignatureParser(prov.GetService <ILogger <SignatureParser> >()))
            .AddSingleton <IRequestSignatureVerifier, RequestSignatureVerifier>();

            return(builder);
        }
Пример #14
0
 public static IHttpMessageSigningVerificationBuilder UseAuthenticationHeaderExtractor <TAuthenticationHeaderExtractor>(this IHttpMessageSigningVerificationBuilder builder)
     where TAuthenticationHeaderExtractor : IAuthenticationHeaderExtractor
 {
     return(builder.UseAuthenticationHeaderExtractor(provider => provider.GetRequiredService <TAuthenticationHeaderExtractor>()));
 }
Пример #15
0
 public static IHttpMessageSigningVerificationBuilder UseSignatureParser <TSignatureParser>(this IHttpMessageSigningVerificationBuilder builder)
     where TSignatureParser : ISignatureParser
 {
     return(builder.UseSignatureParser(provider => provider.GetRequiredService <TSignatureParser>()));
 }