How can I show that this language is context sensitive?
In the same way that DFAs are the counterparts for regular expressions and PDAs are the counterparts for context free languages , the counterpart for context sensitive languages are LBAs (linear bounded Automaton)
That is to say that a language is context sensitive iff some LBA recognises it
But what are LBAs ?
Hopefully you have an idea about what Turing Machines are , an LBA is basically a Turing machine with limited memory , unlike Turing Machines which can access the entire infinite tape , the LBAs computation is restricted to the part of the tape which contains the input , thus the head can only operate in the part of the tape containing the input (hence bounded) , an Alternative less stricter definition is that only a finite contiguous portion of the tape, whose length is a linear function of the length of the initial input, can be accessed by the read/write head (hence linear) , in this way you can imagine the LBA as having a tape of length kn , where n is size of input and k is a constant associated with the machine
Now can we use an LBA to recognise L ?
Let M be an LBA :
M on input w :

Read the first symbol make sure it is an a , else reject ( since n≥1 we can't accept the empty string)

Read the entire string and make sure it follows the right order as , then bs then cs then ds else reject

move the head to the left end of the tape then start crossing an a then a b then a c then a d

Repeat 3 till all as are crossed , when crossing symbols if M finds that w fell short of some symbol (ex: all bs are crossed but we need to cross a b) reject

after all as are crossed read the entire input if there remain any uncrossed symbols reject

else Accept


Clearly M is an LBA that recognises L , thus L is a context sensitive language
Notice how M uses only finite memory , in this example using only the portion of the tape where the input is written is enough to recognise L