public bool IsUserAuthorized(int userId, byte moduleId, int[] functionIds)
        {
            using (AuthenticationDemoEntities dbContext = new AuthenticationDemoEntities())
            {
                try
                {
                    var user = dbContext.Users
                        .Include("AccessToModuleFunctions")
                        .Include("Role")
                        .Include("AccessToModuleFunctions.ModulesFunctions")
                        .Include("AccessToModuleFunctions.ModulesFunctions.Module")
                        .Include("AccessToModuleFunctions.ModulesFunctions.Function")
                        .Include("Role.AccessToModuleFunctions")
                        .Include("Role.AccessToModuleFunctions.ModulesFunctions")
                        .Include("Role.AccessToModuleFunctions.ModulesFunctions.Module")
                        .Include("Role.AccessToModuleFunctions.ModulesFunctions.Function")
                        .FirstOrDefault(usr => usr.ID == userId);

                    if (user == null)
                        return false;

                    IEnumerable<AccessToModuleFunctions> userModFuncs = user.AccessToModuleFunctions
                            .Where(modFunc => modFunc.ModulesFunctions.Module.ID == moduleId
                                && functionIds.Contains((int)modFunc.ModulesFunctions.Function.ID));

                    if (userModFuncs.Count() == 0)
                        userModFuncs = user.Role.AccessToModuleFunctions
                            .Where(modFunc => modFunc.ModulesFunctions.Module.ID == moduleId
                                && functionIds.Contains((int)modFunc.ModulesFunctions.Function.ID));

                    if (userModFuncs.Count() == 0)
                        return false;

                    bool hasAccess = true;
                    foreach (var usrModFunc in userModFuncs)
                    {
                        hasAccess = usrModFunc.HasAccess ?? false;
                        if (!hasAccess)
                            break;
                    }

                    return hasAccess;
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }
 private AccessToModuleFunctions GetAccessByRoleModuleFunciton(int roleId, byte moduleId, long functionId)
 {
     using (AuthenticationDemoEntities dbContext = new AuthenticationDemoEntities())
     {
         try
         {
             return dbContext.AccessToModuleFunctions
                 .FirstOrDefault(urmf => urmf.Role.ID == roleId && urmf.ModulesFunctions.Module.ID == moduleId
                     && urmf.ModulesFunctions.Function.ID == functionId);
         }
         catch (Exception ex)
         {
             throw ex;
         }
     }
 }
        private bool HasUserAccessToModule(int userId, byte moduleId)
        {
            using (AuthenticationDemoEntities dbContext = new AuthenticationDemoEntities())
            {
                try
                {
                    int functionId = Convert.ToInt32(Functions.Access);

                    Users user = dbContext.Users
                        .Include("AccessToModuleFunctions")
                        .Include("Role")
                        .Include("AccessToModuleFunctions.ModulesFunctions")
                        .Include("AccessToModuleFunctions.ModulesFunctions.Module")
                        .Include("AccessToModuleFunctions.ModulesFunctions.Function")
                        .FirstOrDefault(usr => usr.ID == userId);

                    if (user == null)
                        return false;

                       AccessToModuleFunctions userFunc = user.AccessToModuleFunctions
                        .SingleOrDefault(modFunc => modFunc.ModulesFunctions.Function.ID == functionId
                            && modFunc.ModulesFunctions.Module.ID == moduleId);
                    if (userFunc == null)
                    {
                        if (user.Role == null)
                            return false;

                        userFunc = GetAccessByRoleModuleFunciton(user.Role.ID, moduleId, (long)Functions.Access);
                        if (userFunc == null)
                            return false;
                    }

                    return userFunc.HasAccess ?? false;
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }
        private bool Login(string username, string pass)
        {
            if (username == null)
                throw new ArgumentNullException("userName");

            if (username == string.Empty)
                throw new ArgumentException("userName");

            if (pass == null)
                throw new ArgumentNullException("password");

            if (pass == string.Empty)
                throw new ArgumentException("password");

            using (AuthenticationDemoEntities dbContext = new AuthenticationDemoEntities())
            {
                var strDBHash = string.Empty;
                var strDBSalt = string.Empty;
                var logonUser = dbContext.Users.FirstOrDefault(user => user.UserName.Equals( username));

                if (logonUser == null) return false;

                strDBSalt = logonUser.Salt;
                WebSecurity.HashWithSalt(pass, ref strDBSalt, out strDBHash);

                if (strDBHash != logonUser.Hash) return false;

            }
            return true;
        }
        private Users GetUserByUserName(string username)
        {
            using (AuthenticationDemoEntities dbContext = new AuthenticationDemoEntities())
            {

                var logonUser = dbContext.Users.FirstOrDefault(user => user.UserName.Equals(username));

                if (logonUser == null) return null;

                return logonUser;

            }
        }