Beispiel #1
0
        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));
        }
Beispiel #2
0
        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,
            });
        }