When I understand your question correctly you are not interested in the full solution space. In that case you can generate alternative optimal solutions by first solving your problem to optimality. Then you can add the objective function with the optimal value as a constraint and resolve with a random objective vector. For example for the problem.
$
\begin{align}
\min && c^Tx\\
\text{s.t.}&& Ax\leq b\\
&& x\geq 0
\end{align}
$
Let $C^*$ be the optimal objective value you get from solving the initial problem and let $c'$ be an other random objective vector. Then solving
$
\begin{align}
\min && c'^Tx\\
\text{s.t.}&& Ax&\leq b\\
&& c^Tx &= C^*\\
&& x&\geq 0
\end{align}
$
will give you a solution that is optimal with respect to the original objective $\min c^Tx$.
If you are interested in getting all optimal solutions you will need to find all optimal basis solutions as pointed you by @Erwin Kalvelagen here.
There are multiple ways to do so. Either you solve multiple MIPs where in each iteration you add cuts that prevent you from finding previously found basis solutions again. It is described in this blog post. As pointed out by Erwin Kalvelagen some solvers like gurobi provide features that allow to extract multiple optimal solutions. If these are not available multiple MIPs might to be solved, which could result in quite big runtimes.
The more direct way would be to modify the Simplex Algorithm to not exchange for better basis solutions, but for equal ones. Starting with an optimal solution (which you can get from any LP solver you want) you choose entering variables with entry in the objective row $=0$. For leaving variables you proceed as usual. To ensure you find all solutions you can use classic graph traversal techniques.
Note that any optimal solution can then be expressed as linear combinations of the optimal basis solutions.