Esempio n. 1
0
        public async Task <object> Ping()
        {
            AuthResults         result = new AuthResults();
            IEnumerable <Claim> claims = this.HttpContext.User.Claims;

            foreach (Claim claim in claims)
            {
                if (claim.Type == Types.BirdsNestAdminsClaim && claim.Value == TRUE_STRING)
                {
                    result.IsAdmin         = true;
                    result.IsAuthenticated = true;
                    result.IsAuthorized    = true;
                    result.Message         = "OK";
                    break;
                }
                else if (claim.Type == Types.BirdsNestUsersClaim && claim.Value == TRUE_STRING)
                {
                    result.IsAuthenticated = true;
                    result.IsAuthorized    = true;
                    result.Message         = "OK";
                }
                else if (claim.Type == ClaimTypes.GivenName)
                {
                    result.Name = claim.Value;
                }
            }

            if (result.IsAuthorized == false)
            {
                await Logout();
            }
            result.IsProcessed = true;
            return(result);
        }
Esempio n. 2
0
        public async Task <object> Login([FromForm] AuthDetails details)
        {
            this._logger.LogInformation("Login requested: {0} - {1}", details.Username, details.Provider);
            AuthResults result = null;

            if (details.IsValid())
            {
                result = await Auth(details);
            }
            else
            {
                result         = new AuthResults();
                result.Message = "Invalid login data";
            }
            return(result);
        }
Esempio n. 3
0
        public async Task <object> Logout()
        {
            await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);

            foreach (var cookie in HttpContext.Request.Cookies)
            {
                if (cookie.Key == ".AspNetCore.Cookies" || cookie.Key.StartsWith(".AspNetCore.Antiforgery."))
                {
                    HttpContext.Response.Cookies.Delete(cookie.Key);
                }
            }

            AuthResults result = new AuthResults();

            result.Message     = "Logged out";
            result.IsProcessed = true;
            return(result);
        }
Esempio n. 4
0
        public static void HandleAuthResponse(AuthResults result, RealmSession session)
        {
            var authResponse = new Packet(ServerMessages.AuthResponse);

            var hasSuccessInfo = result == AuthResults.Ok;
            var hasWaitInfo    = result == AuthResults.WaitQueue;

            authResponse.Write(result);

            authResponse.PutBit(hasSuccessInfo);
            authResponse.PutBit(hasWaitInfo);

            if (hasSuccessInfo)
            {
            }

            if (hasWaitInfo)
            {
            }

            session.Send(authResponse);
        }
Esempio n. 5
0
        public static void HandleAuthResponse(AuthResults result, RealmSession session)
        {
            var gameAccount = session.GameAccount;
            var realm       = session.Realm;

            var authResponse = new Packet(ServerMessages.AuthResponse);

            var hasSuccessInfo = result == AuthResults.Ok;
            var hasWaitInfo    = result == AuthResults.WaitQueue;

            authResponse.Write(result);

            authResponse.PutBit(hasSuccessInfo);
            authResponse.PutBit(hasWaitInfo);
            authResponse.Flush();

            if (hasSuccessInfo)
            {
                var allowedRaces   = Manager.GameAccountMgr.GetAvailableRaces(gameAccount, realm);
                var allowedClasses = Manager.GameAccountMgr.GetAvailableClasses(gameAccount, realm);
                var charTemplates  = Manager.GameAccountMgr.GetAvailableCharacterTemplates(gameAccount, realm);

                authResponse.Write <uint>(0);
                authResponse.Write <uint>(0);
                authResponse.Write <uint>(0);
                authResponse.Write <uint>(0);
                authResponse.Write <uint>(0);
                authResponse.Write(gameAccount.BoxLevel);
                authResponse.Write(gameAccount.BoxLevel);
                authResponse.Write <uint>(0);
                authResponse.Write(allowedRaces.Count);
                authResponse.Write(allowedClasses.Count);
                authResponse.Write(charTemplates.Count);
                authResponse.Write <uint>(0);

                foreach (var r in allowedRaces)
                {
                    authResponse.Write(r.Key);
                    authResponse.Write(r.Value);
                }

                foreach (var c in allowedClasses)
                {
                    authResponse.Write(c.Key);
                    authResponse.Write(c.Value);
                }

                foreach (var set in charTemplates)
                {
                    authResponse.Write(set.Id);
                    authResponse.Write(set.CharacterTemplateClasses.Count);

                    foreach (var c in set.CharacterTemplateClasses)
                    {
                        authResponse.Write((byte)c.ClassId);
                        authResponse.Write(c.FactionGroup);
                    }

                    authResponse.PutBits(set.Name.Length, 7);
                    authResponse.PutBits(set.Description.Length, 10);

                    authResponse.Flush();

                    authResponse.Write(set.Name);
                    authResponse.Write(set.Description);
                }

                authResponse.PutBit(0);
                authResponse.PutBit(0);
                authResponse.PutBit(0);
                authResponse.PutBit(0);
                authResponse.PutBit(0);

                authResponse.Flush();
            }

            session.Send(authResponse);
        }
Esempio n. 6
0
        public static void HandleAuthResponse(AuthResults result, RealmSession session)
        {
            var gameAccount = session.GameAccount;
            var realm = session.Realm;

            var authResponse = new Packet(ServerMessages.AuthResponse);

            var hasSuccessInfo = result == AuthResults.Ok;
            var hasWaitInfo    = result == AuthResults.WaitQueue;

            authResponse.Write(result);

            authResponse.PutBit(hasSuccessInfo);
            authResponse.PutBit(hasWaitInfo);
            authResponse.Flush();

            if (hasSuccessInfo)
            {
                var allowedRaces   = Manager.GameAccountMgr.GetAvailableRaces(gameAccount, realm);
                var allowedClasses = Manager.GameAccountMgr.GetAvailableClasses(gameAccount, realm);
                var charTemplates  = Manager.GameAccountMgr.GetAvailableCharacterTemplates(gameAccount, realm);

                authResponse.Write<uint>(0);
                authResponse.Write<uint>(0);
                authResponse.Write<uint>(0);
                authResponse.Write<uint>(0);
                authResponse.Write<uint>(0);
                authResponse.Write(gameAccount.BoxLevel);
                authResponse.Write(gameAccount.BoxLevel);
                authResponse.Write<uint>(0);
                authResponse.Write(allowedRaces.Count);
                authResponse.Write(allowedClasses.Count);
                authResponse.Write(charTemplates.Count);
                authResponse.Write<uint>(0);

                foreach (var r in allowedRaces)
                {
                    authResponse.Write(r.Key);
                    authResponse.Write(r.Value);
                }

                foreach (var c in allowedClasses)
                {
                    authResponse.Write(c.Key);
                    authResponse.Write(c.Value);
                }

                foreach (var set in charTemplates)
                {
                    authResponse.Write(set.Id);
                    authResponse.Write(set.CharacterTemplateClasses.Count);

                    foreach (var c in set.CharacterTemplateClasses)
                    {
                        authResponse.Write((byte)c.ClassId);
                        authResponse.Write(c.FactionGroup);
                    }

                    authResponse.PutBits(set.Name.Length, 7);
                    authResponse.PutBits(set.Description.Length, 10);

                    authResponse.Flush();

                    authResponse.Write(set.Name);
                    authResponse.Write(set.Description);
                }

                authResponse.PutBit(0);
                authResponse.PutBit(0);
                authResponse.PutBit(0);
                authResponse.PutBit(0);
                authResponse.PutBit(0);

                authResponse.Flush();
            }

            session.Send(authResponse);
        }
Esempio n. 7
0
        private async Task <AuthResults> Auth(AuthDetails details)
        {
            AuthResults result = new AuthResults();

            try
            {
                IAuthConfiguration conf = this._configlist.GetAuthConfiguration(details.Provider);
                if (conf == null)
                {
                    throw new ArgumentException("Provider not found");
                }
                ILogin login = conf.GetLogin(details.Username, details.Password);

                if (login.IsAuthenticated)
                {
                    result.Name            = login.GivenName;
                    result.IsAuthenticated = true;
                    if (login.IsAuthorised == false)
                    {
                        result.Message = "You are not authorised to use BirdsNest. Please contact your administrator";
                        this._logger.LogWarning("Login not authorised: {username}", details.Username);
                        return(result);
                    }

                    var claims = new List <Claim> {
                        new Claim(ClaimTypes.GivenName, login.GivenName, conf.Name),
                        new Claim(ClaimTypes.Name, login.Name, conf.Name),
                        new Claim(ClaimTypes.Surname, login.Surname, conf.Name),
                        new Claim(ClaimTypes.Sid, login.ID, conf.Name)
                    };

                    if (login.IsUser)
                    {
                        claims.Add(new Claim(Types.BirdsNestUsersClaim, TRUE_STRING, ClaimValueTypes.Boolean, conf.Name));
                    }

                    if (login.IsAdmin)
                    {
                        result.IsAdmin = true;
                        claims.Add(new Claim(Types.BirdsNestAdminsClaim, TRUE_STRING, ClaimValueTypes.Boolean, conf.Name));
                    }

                    var userIdentity   = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
                    var userPrincipal  = new ClaimsPrincipal(userIdentity);
                    var authProperties = new AuthenticationProperties
                    {
                        ExpiresUtc   = DateTime.UtcNow.AddSeconds(login.TimeoutSeconds),
                        IsPersistent = false,
                        AllowRefresh = true
                    };

                    await this.HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, userPrincipal, authProperties);

                    result.IsAuthorized = true;
                    result.Message      = "OK";
                    this._logger.LogInformation("Login successful: {username}", details.Username);
                }
                else
                {
                    result.Message = "Login failed";
                }

                result.IsProcessed = true;
            }
            catch (Exception e)
            {
                result.Message = "There was an error logging in: " + e.Message;
                this._logger.LogWarning("Login error: {username}. Error: {error}", details.Username, e.Message);
                this._logger.LogTrace(e, "Login error stacktrace");
            }
            return(result);
        }