using System; using System.Collections.Generic; using System.Linq; using System.Net.NetworkInformation; using System.Threading; using System.Threading.Tasks; using Application.Domain.Entities; using Application.Services; using Infrastructure.Data; using Infrastructure.Domain; using Infrastructure.Email; using Infrastructure.Extensions; using Infrastructure.Security; using Infrastructure.UI; using Infrastructure.Web; using IoTNode.Services; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.SignalR.Client; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using WampSharp.V2; namespace IoTNode { public class Startup : BaseStartup { public static HubConnection HubConnection; public string ServerHubUrl { get; private set; } public Startup(IConfiguration configuration, IHostingEnvironment env) : base(configuration, env) { } public override void ConfigureServices(IServiceCollection services) { services.AddTransient(); services.AddSingleton(); base.ConfigureServices(services); services.ConfigureOptions(new FileConfigureOptions(_env, new List { "IoT.Shared" })); } public override void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { base.Configure(app, env, loggerFactory); if (this._cfg.GetValue("notify:enabled")) { Task.Run(() => { var location = $"ws://{this._cfg["notify:host"]}/ws"; var channelFactory = new DefaultWampChannelFactory(); var channel = channelFactory.CreateJsonChannel(location, Helper.Instance.GetMacAddress()); channel.RealmProxy.Monitor.ConnectionBroken += (sender, args) => { Console.WriteLine("wamp>Disconnected"); }; async Task connect() { Console.WriteLine($"wamp>start connect to {location}"); try { await channel.Open().ConfigureAwait(false); Console.WriteLine("wamp>channel opend"); while (true) { try { var nodeService = app.ApplicationServices.GetService(); await channel.RealmProxy.Services.RegisterCallee(nodeService); Console.WriteLine("wamp>services registed"); break; } catch (Exception ex) { ex.PrintStack(); Console.WriteLine("wamp>services regist error"); Thread.Sleep(5 * 1000); } } } catch (Exception ex) { ex.PrintStack(); Console.WriteLine("wamp>services open error"); } } var reconnector = new WampChannelReconnector(channel, connect); reconnector.Start(); }); } app.ApplicationServices.GetService().Start(); } public override Task ValidatePrincipal(CookieValidatePrincipalContext arg) { return Task.Run(() => { var userRepo = arg.HttpContext.RequestServices.GetService>(); var userName = arg.Principal.Identity.Name; var userPermissions = userRepo.ReadOnlyTable().Where(o => o.UserName == userName) .SelectMany(o => o.UserRoles) .Select(o => o.Role) .SelectMany(o => o.RolePermissions) .Select(o => o.Permission.Number) .ToList(); var currentPermissions = arg.Principal.Claims.Where(o => o.Type == "Role").Select(o => o.Value).ToList(); if (!currentPermissions.SequenceEqual(userPermissions)) { arg.HttpContext.SignOutAsync(); arg.HttpContext.SignIn(userName, userPermissions, arg.Properties.IsPersistent); } }); } public override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity().HasOne(o => o.Parent).WithMany(o => o.Children).HasForeignKey(o => o.ParentId).OnDelete(DeleteBehavior.SetNull); modelBuilder.Entity().HasOne(o => o.Category).WithMany(o => o.Permissions).HasForeignKey(o => o.CategoryId).OnDelete(DeleteBehavior.SetNull); modelBuilder.Entity().HasOne(o => o.User).WithMany(o => o.UserRoles).HasForeignKey(o => o.UserId); modelBuilder.Entity().HasOne(o => o.Role).WithMany(o => o.UserRoles).HasForeignKey(o => o.RoleId); modelBuilder.Entity().HasOne(o => o.Role).WithMany(o => o.RolePermissions).HasForeignKey(o => o.RoleId); modelBuilder.Entity().HasOne(o => o.Permission).WithMany(o => o.RolePermissions).HasForeignKey(o => o.PermissionId); modelBuilder.Entity().HasIndex(o => o.UserName).IsUnique(); modelBuilder.Entity().HasIndex(o => o.Email).IsUnique(); modelBuilder.Entity().HasIndex(o => o.Name).IsUnique(); modelBuilder.Entity().HasIndex(o => o.Number).IsUnique(); modelBuilder.Entity().HasIndex(o => o.Number).IsUnique(); modelBuilder.Entity().HasIndex(o => new { o.UserId, o.RoleId }).IsUnique(); modelBuilder.Entity().HasIndex(o => new { o.RoleId, o.PermissionId }).IsUnique(); // modelBuilder.Entity().HasOne(o => o.Node).WithMany(o => o.Devices).HasForeignKey(o => o.NodeId); modelBuilder.Entity().HasOne(o => o.Device).WithMany(o => o.Data).HasForeignKey(o => o.DeviceId); modelBuilder.Entity().HasOne(o => o.Device).WithMany(o => o.Apis).HasForeignKey(o => o.DeviceId); modelBuilder.Entity().HasOne(o => o.Api).WithMany(o => o.Parameters).HasForeignKey(o => o.ApiId); modelBuilder.Entity().HasOne(o => o.Node).WithMany(o => o.Sences).HasForeignKey(o => o.NodeId); modelBuilder.Entity().HasOne(o => o.Sence).WithMany(o => o.Commands).HasForeignKey(o => o.SenceId); modelBuilder.Entity().HasIndex(o => o.Number).IsUnique(); modelBuilder.Entity().HasIndex(o => o.Number).IsUnique(); modelBuilder.Entity().HasIndex(o => new { o.DeviceId, o.Key }).IsUnique(); modelBuilder.Entity().HasIndex(o => new { o.DeviceId, o.Path, o.Command }).IsUnique(); modelBuilder.Entity().HasIndex(o => new { o.ApiId, o.Name }).IsUnique(); } public override void Seed(DbContext dbContext, IServiceProvider serviceProvider, IConfiguration configuration) { dbContext.Set().Add(new PermissionCategory { Name = "配置", Number = "Configuration", Permissions = new List { new Permission { Name = "查询配置", Number = "ListConfiguration",DisplayOrder =1 }, new Permission { Name = "修改配置", Number = "EditConfiguration",DisplayOrder =2 } } }); int i = 1; var skipReadCollection = new string[] { "Permission" }; var skipAddCollection = new string[] { "Permission", "Setting" }; foreach (var item in dbContext.Model.GetEntityTypes()) { var type = item.ClrType; var name = type.GetDisplayName(); var number = type.Name; var category = new PermissionCategory { Name = name, Number = type.Name, DisplayOrder = i }; category.Permissions.Add(new Permission { Name = $"查询{name}", Number = $"List{number}", DisplayOrder = 10 * i + 1 }); if (!skipReadCollection.Contains(type.Name)) { category.Permissions.Add(new Permission { Name = $"查看{name}", Number = $"Read{number}", DisplayOrder = 10 * i + 2 }); } if (!skipAddCollection.Contains(type.Name)) { category.Permissions.Add(new Permission { Name = $"添加{name}", Number = $"Add{number}", DisplayOrder = 10 * i + 3 }); } if (!typeof(IDisableUpdate).IsAssignableFrom(type)) { category.Permissions.Add(new Permission { Name = $"修改{name}", Number = $"Edit{number}", DisplayOrder = 10 * i + 4 }); } if (!typeof(IDisableDelete).IsAssignableFrom(type)) { category.Permissions.Add(new Permission { Name = $"删除{name}", Number = $"Delete{number}", DisplayOrder = 10 * i + 5 }); } dbContext.Set().Add(category); i += 1; } dbContext.SaveChanges(); var adminRole = new Role { Name = "管理员", IsReadOnly = true }; foreach (var item in dbContext.Set()) { adminRole.RolePermissions.Add(new RolePermission { Permission = item, IsReadOnly = true }); } var encryptionService = serviceProvider.GetService(); var securityStam = "123456"; dbContext.Set().Add(new User { UserName = "admin", SecurityStamp = securityStam, PasswordHash = encryptionService.CreatePasswordHash("123456", securityStam), Email = "test@test.com", UserRoles = new List { new UserRole { Role = adminRole } } }); dbContext.Set().Add(new Node { Name = "节点服务器", Number = Helper.Instance.GetMacAddress() }); dbContext.SaveChanges(); } } }