public async Task <LoginResult> LoginAsync(string user, string password, string terminal = null) { Terminal = terminal ?? Terminal; if (string.Equals(user, ServiceStartup.Kernel, StringComparison.OrdinalIgnoreCase)) { var primary = new AuthorizedUserCache { UniqueId = SfraObject.EmptyId(), LoginId = ServiceStartup.Kernel, DisplayName = "Kernel User", Kernel = true, Token = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.ffffff") }; await ServiceStartup.SetPrimaryAuthorizedAsync(Terminal, primary); return(new LoginResult { Code = LoginCode.Ok, Jwt = primary.Token, Ip = Terminal, }); } var find = mongo.UserCollection.AsQueryable().FirstOrDefault(u => u.LoginId.ToLower() == user.ToLower()); var code = LoginCode.Ok; if (find == null) { code = LoginCode.NotExist; } else if (find.IsDisabled) { code = LoginCode.UserIsDenied; } else if (!find.CanPasswordAuth) { code = LoginCode.PwdAuthDenied; } else if (Helper.ComputeMd5Hash(password, find) != find.Password) { code = LoginCode.PasswordError; } return(await TryLoginAsync(code, find, Terminal)); }
private async Task <LoginResult> TryLoginAsync(LoginCode code, User find, string ip) { if (code == LoginCode.Ok) { // 默认单人登录 var single = (mongo.SystemConfigCollection.AsQueryable().Where(s => s.Key == $"{ip}:SingleAuth").Select(s => s.JObject).FirstOrDefault() ?? "true").Equals("true", StringComparison.OrdinalIgnoreCase); var isFirstUser = false; var primary = ServiceStartup.GetPrimaryAuthorized(ip); var token = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.ffffff"); var menuId = mongo.RoleCollection.AsQueryable().FirstOrDefault(r => r.Users.Contains(find.UniqueId) && r.DefaultMenu != null)?.DefaultMenu ?? null; var menu = mongo.MenuCollection.AsQueryable().FirstOrDefault(f => f.UniqueId == menuId); var defaultMenu = menu == null ? null : $"/{menu.ParentId}/{menu.Uri}"; if (primary == null) { isFirstUser = true; primary = new AuthorizedUserCache { UniqueId = find.UniqueId, LoginId = find.LoginId, DisplayName = find.Employee?.DisplayName ?? find.LoginId, Kernel = false, Token = token, DefaultMenu = defaultMenu, }; await ServiceStartup.SetPrimaryAuthorizedAsync(ip, primary); } if (single) { await mongo.AccessJournalCollection.InsertOneAsync(new AccessJournal { Computer = ip, UserId = primary.LoginId, UserName = primary.DisplayName, }); return(new LoginResult { Code = code, Jwt = token, Menu = defaultMenu, Ip = ip, }); } if (!isFirstUser) { if (find.LoginId == primary.LoginId) { return(new LoginResult { Code = LoginCode.DuplicateLogin, Ip = ip, }); } await ServiceStartup.SetSecondaryAuthorizedAsync(ip, new AuthorizedUserCache { UniqueId = find.UniqueId, LoginId = find.LoginId, DisplayName = find.Employee?.DisplayName ?? find.LoginId, Kernel = false, Token = token, DefaultMenu = defaultMenu, }); await mongo.AccessJournalCollection.InsertOneAsync(new AccessJournal { Computer = ip, UserId = primary.LoginId, UserName = primary.DisplayName, }); await mongo.AccessJournalCollection.InsertOneAsync(new AccessJournal { Computer = ip, UserId = find.LoginId, UserName = find.DisplayName, }); return(new LoginResult { Code = code, Jwt = token, Menu = defaultMenu, Ip = ip, }); } } return(new LoginResult { Code = code, Ip = ip, }); }