private TimeSpan DefaultTimeout { get; } = new TimeSpan(0, 0, 0, 0, 500); // FUTURE use configuration value public LoginAttemptController( LoginAttemptClient loginAttemptClient, UserAccountClient userAccountClient, MemoryUsageLimiter memoryUsageLimiter, BlockingAlgorithmOptions blockingOptions, IStableStore stableStore) { _options = blockingOptions;//optionsAccessor.Options; _stableStore = stableStore; _passwordPopularityTracker = new PasswordPopularityTracker("FIXME-uniquekeyfromconfig" //FIXME -- use configuration to get options here"FIXME-uniquekeyfromconfig", thresholdRequiredToTrackPreciseOccurrences: 10); ); _loginAttemptCache = new FixedSizeLruCache<string, LoginAttempt>(80000); // FIXME -- use configuration file for size _loginAttemptsInProgress = new Dictionary<string, Task<LoginAttempt>>(); _ipHistoryCache = new SelfLoadingCache<IPAddress, IpHistory>( (id, cancellationToken) => { return Task.Run(() => new IpHistory(id), cancellationToken); // FUTURE -- option to load from stable store }); _loginAttemptClient = loginAttemptClient; _loginAttemptClient.SetLocalLoginAttemptController(this); SetUserAccountClient(userAccountClient); memoryUsageLimiter.OnReduceMemoryUsageEventHandler += ReduceMemoryUsage; }
public void Init() { var builder = new ConfigurationBuilder() .SetBasePath("") .AddJsonFile("appsettings.json"); builder.AddEnvironmentVariables(); Configuration = builder.Build(); sqlConnectionString = Configuration["Data:ConnectionString"]; string cloudStorageConnectionString = Configuration["Data:StorageConnectionString"]; _options = new BlockingAlgorithmOptions(); DbContextOptionsBuilder<DbUserAccountContext> dbOptionsBuilder = new DbContextOptionsBuilder<DbUserAccountContext>(); dbOptionsBuilder.UseSqlServer(sqlConnectionString); dbOptions = dbOptionsBuilder.Options; _CloudStorageAccount = CloudStorageAccount.Parse(cloudStorageConnectionString); userAccountControllerFactory = new DbUserAccountControllerFactory(_CloudStorageAccount, dbOptions); userAccountController = userAccountControllerFactory.CreateDbUserAccountController(); RemoteHost localHost = new RemoteHost { Uri = new Uri("http://localhost:35358") }; MaxWeightHashing<RemoteHost> hosts = new MaxWeightHashing<RemoteHost>(Configuration["Data:UniqueConfigurationSecretPhrase"]); LoginAttemptClient<DbUserAccount> loginAttemptClient = new LoginAttemptClient<DbUserAccount>(hosts, localHost); _UserAccountRepositoryFactory = new DbUserAccountRepositoryFactory(dbOptions); BinomialLadderFilter localPasswordBinomialLadderFilter = new BinomialLadderFilter( _options.NumberOfBitsInBinomialLadderFilter_N, _options.HeightOfBinomialLadder_H); _loginAttemptController = new LoginAttemptController<DbUserAccount>( userAccountControllerFactory, _UserAccountRepositoryFactory, localPasswordBinomialLadderFilter, new MemoryUsageLimiter(), _options); //services.AddEntityFramework() // .AddSqlServer() // .AddDbContext<DbUserAccountContext>(opt => opt.UseSqlServer(sqlConnectionString)); //DbUserAccountContext context = new DbUserAccountContext(); //var db = new DbContextOptionsBuilder(); //db.UseInMemoryDatabase(); //_context = new MyContext(db.Options); }
public UserAccountController( UserAccountClient userAccountClient, LoginAttemptClient loginAttemptClient, MemoryUsageLimiter memoryUsageLimiter, BlockingAlgorithmOptions options, IStableStore stableStore, LimitPerTimePeriod[] creditLimits) { // _options = optionsAccessor.Options; _options = options; _stableStore = stableStore; _userAccountClient = userAccountClient; CreditLimits = creditLimits; _userAccountCache = new SelfLoadingCache<string, UserAccount>(_stableStore.ReadAccountAsync); SetLoginAttemptClient(loginAttemptClient); userAccountClient.SetLocalUserAccountController(this); memoryUsageLimiter.OnReduceMemoryUsageEventHandler += ReduceMemoryUsage; }
public Simulator(ExperimentalConfiguration myExperimentalConfiguration, BlockingAlgorithmOptions options = default(BlockingAlgorithmOptions)) { MyExperimentalConfiguration = myExperimentalConfiguration; if (options == null) options = new BlockingAlgorithmOptions(); CreditLimits = new[] { // 3 per hour new LimitPerTimePeriod(new TimeSpan(1, 0, 0), 3f), // 6 per day (24 hours, not calendar day) new LimitPerTimePeriod(new TimeSpan(1, 0, 0, 0), 6f), // 10 per week new LimitPerTimePeriod(new TimeSpan(6, 0, 0, 0), 10f), // 15 per month new LimitPerTimePeriod(new TimeSpan(30, 0, 0, 0), 15f) }; //We are testing with local server now MyResponsibleHosts = new MaxWeightHashing<RemoteHost>("FIXME-uniquekeyfromconfig"); //configuration.MyResponsibleHosts.Add("localhost", new RemoteHost { Uri = new Uri("http://localhost:80"), IsLocalHost = true }); RemoteHost localHost = new RemoteHost { Uri = new Uri("http://localhost:80") }; MyResponsibleHosts.Add("localhost", localHost); MyUserAccountClient = new UserAccountClient(MyResponsibleHosts, localHost); MyLoginAttemptClient = new LoginAttemptClient(MyResponsibleHosts, localHost); MemoryUsageLimiter memoryUsageLimiter = new MemoryUsageLimiter(); MyUserAccountController = new UserAccountController(MyUserAccountClient, MyLoginAttemptClient, memoryUsageLimiter, options, StableStore, CreditLimits); MyLoginAttemptController = new LoginAttemptController(MyLoginAttemptClient, MyUserAccountClient, memoryUsageLimiter, options, StableStore); MyUserAccountController.SetLoginAttemptClient(MyLoginAttemptClient); MyUserAccountClient.SetLocalUserAccountController(MyUserAccountController); MyLoginAttemptController.SetUserAccountClient(MyUserAccountClient); MyLoginAttemptClient.SetLocalLoginAttemptController(MyLoginAttemptController); //fix outofmemory bug by setting the loginattempt field to null StableStore.LoginAttempts = null; }
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { // Add framework services. services.AddMvc(); string sqlConnectionString = Configuration["Data:ConnectionString"]; services.AddDbContext<DbUserAccountContext>( opt => opt.UseSqlServer(sqlConnectionString)); // Uncomment the following line to add Web API services which makes it easier to port Web API 2 controllers. // You will also need to add the Microsoft.AspNet.Mvc.WebApiCompatShim package to the 'dependencies' section of project.json. // services.AddWebApiConventions(); BlockingAlgorithmOptions options = new BlockingAlgorithmOptions(); services.AddSingleton<BlockingAlgorithmOptions>(x => options); RemoteHost localHost = new RemoteHost { Uri = new Uri("http://localhost:35358") }; services.AddSingleton<RemoteHost>(x => localHost); MaxWeightHashing<RemoteHost> hosts = new MaxWeightHashing<RemoteHost>(Configuration["Data:UniqueConfigurationSecretPhrase"]); hosts.Add("localhost", localHost); services.AddSingleton<IDistributedResponsibilitySet<RemoteHost>>(x => hosts); string cloudStorageConnectionString = Configuration["Data:StorageConnectionString"]; CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(cloudStorageConnectionString); services.AddSingleton<CloudStorageAccount>(a => cloudStorageAccount); services.AddSingleton<MemoryUsageLimiter, MemoryUsageLimiter>(); if (hosts.Count > 0) { DistributedBinomialLadderFilterClient dblfClient = new DistributedBinomialLadderFilterClient( options.NumberOfVirtualNodesForDistributedBinomialLadder, options.HeightOfBinomialLadder_H, hosts, options.PrivateConfigurationKey, options.MinimumBinomialLadderFilterCacheFreshness); // If running as a distributed system services.AddSingleton<IBinomialLadderFilter, DistributedBinomialLadderFilterClient>(x => dblfClient); DistributedBinomialLadderFilterController filterController = new DistributedBinomialLadderFilterController(dblfClient, options.NumberOfBitsPerShardInBinomialLadderFilter, options.PrivateConfigurationKey); services.AddSingleton<DistributedBinomialLadderFilterController>(x => filterController); //services.AddSingleton<IFrequenciesProvider<string>>(x => // new IncorrectPasswordFrequencyClient(hosts, options.NumberOfRedundantHostsToCachePasswordPopularity)); } else { BinomialLadderFilter localPasswordBinomialLadderFilter = new BinomialLadderFilter(options.NumberOfBitsInBinomialLadderFilter_N, options.HeightOfBinomialLadder_H); services.AddSingleton<IBinomialLadderFilter>(x => localPasswordBinomialLadderFilter); } LoginAttemptClient<DbUserAccount> loginAttemptClient = new LoginAttemptClient<DbUserAccount>(hosts, localHost); services.AddSingleton<IUserAccountRepositoryFactory<DbUserAccount>, DbUserAccountRepositoryFactory>(); services.AddSingleton<IUserAccountControllerFactory<DbUserAccount>, DbUserAccountControllerFactory>(); //LoginAttemptController<DbUserAccount> loginAttemptController = new LoginAttemptController<DbUserAccount>( // new DbUserAccountControllerFactory(cloudStorageAccount), new DbUserAccountRepositoryFactory()); services.AddSingleton<ILoginAttemptClient, LoginAttemptClient<DbUserAccount>>(i => loginAttemptClient); services.AddSingleton<ILoginAttemptController, LoginAttemptController<DbUserAccount>>(); }
public void SetLoginAttemptClient(LoginAttemptClient loginAttemptClient) { _loginAttemptClient = loginAttemptClient; }