Python 3, 31 bytes
Input is \$ 0 \$-indexed.
lambda a:{*a}=={*range(len(a))} This is the most obvious implementation I could think of. It compares the set of \$ a \$ to the set of numbers from 0 to len(a)-1.
Python 3, 30 bytes
As @ovs suggested, we can save a byte by switching the definition of truthy and falsey. A valid permutation returns a falsey value, and truthy otherwise.
lambda a:{*a}^{*range(len(a))}