public static IdentityBuilder AddIdentityMongoDbProvider <TUser, TRole>(this IServiceCollection services, Action <IdentityOptions> setupIdentityAction, Action <MongoIdentityOptions> setupDatabaseAction) where TUser : ApplicationUser where TRole : Role { MongoIdentityOptions dbOptions = new MongoIdentityOptions(); setupDatabaseAction(dbOptions); IdentityBuilder builder = services.AddIdentity <TUser, TRole>(setupIdentityAction ?? (x => { })); builder.AddRoleStore <RoleStore <TRole> >() .AddUserStore <UserStore <TUser, TRole> >() .AddUserManager <UserManager <TUser> >() .AddRoleManager <RoleManager <TRole> >() .AddDefaultTokenProviders(); IMongoCollection <TUser> userCollection = MongoUtil.FromConnectionString <TUser>(dbOptions.ConnectionString, dbOptions.DatabaseName, dbOptions.UsersCollection); IMongoCollection <TRole> roleCollection = MongoUtil.FromConnectionString <TRole>(dbOptions.ConnectionString, dbOptions.DatabaseName, dbOptions.RolesCollection); services.AddSingleton(x => userCollection); services.AddSingleton(x => roleCollection); // Identity Services services.AddTransient <IUserStore <TUser> >(x => new UserStore <TUser, TRole>(userCollection, roleCollection, x.GetService <ILookupNormalizer>())); services.AddTransient <IRoleStore <TRole> >(x => new RoleStore <TRole>(roleCollection)); Task <System.Collections.Generic.List <TUser> > all = userCollection.All(); all.Wait(); return(builder); }
protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { await Task.Delay(1000, stoppingToken); var nodes = nodesCol.All(); foreach (var node in nodes) { if (stoppingToken.IsCancellationRequested) { break; } var lastStatus = statusCol.Find(s => s.NodeId == node.Id).SortByDescending(s => s.LastTime).FirstOrDefault(cancellationToken: stoppingToken); if (node.CheckMechanism == NetworkNode.CheckMechanismEnum.Ping) { Ping p = new Ping(); try { if (lastStatus == null) { lastStatus = NewStatus(node.Id); } var reply = await p.SendPingAsync(node.Address, 2000); if (lastStatus.IpStatus != reply.Status) { lastStatus = NewStatus(node.Id); } lastStatus.IpStatus = reply.Status; } catch (Exception ex) { lastStatus.ErrorMessage = GetErrorMessages(ex); } } else if (node.CheckMechanism == NetworkNode.CheckMechanismEnum.Http) { var httpClient = httpClientFactory.CreateClient(); try { string address = node.Address; if (!address.StartsWith("http")) { address = "http://" + node.Address; } if (lastStatus == null) { lastStatus = NewStatus(node.Id); } var reply = await httpClient.GetAsync(address, stoppingToken); if (lastStatus.HttpStatus != reply.StatusCode) { lastStatus = NewStatus(node.Id); } lastStatus.HttpStatus = reply.StatusCode; } catch (Exception ex) { lastStatus.ErrorMessage = GetErrorMessages(ex); } } else { throw new NotImplementedException(); } // Send alert if required: if (!lastStatus.IsSuccess && (lastStatus.AlertSendTime == null || DateTime.Now - lastStatus.AlertSendTime > TimeSpan.FromMinutes(alertResendMinutes)) && DateTime.Now - lastStatus.StartTime > TimeSpan.FromSeconds(errorWaitSeconds)) { var content = alertContent.Replace("{nodeName}", node.Name); var receivers = new HashSet <string>(); if (node.AlertReceivers != null) { foreach (var dest in node.AlertReceivers) { if (!receivers.Contains(dest)) { await alertSender.Send(node.Id, dest, content); receivers.Add(dest); } } } foreach (var dest in (await alertReceiversCol.AllAsync()).Select(r => r.Address)) { if (!receivers.Contains(dest)) { await alertSender.Send(node.Id, dest, content); receivers.Add(dest); } } lastStatus.AlertSendTime = DateTime.Now; } lastStatus.LastTime = DateTime.Now; await statusCol.SaveAsync(lastStatus); } } }