Giusto.... Il test seguente

codice:
(array_key_exists($_POST['utente'], $user))  && (in_array($_POST['passwd'], $user))
da' sempre vero in entrambi i casi da te citati perche' la funzione in_array controlla la presenza del valore $_POST['passwd'] in tutto l'array, indipendentemente dalla chiave....

ti consiglio invece di implementare il seguente controllo:

codice:
(array_key_exists($_POST['utente'], $user))  && ($user[$_POST['utente']]==$_POST['passwd'] )
oppure compara le stringhe $user[$_POST['utente']] e $_POST['passwd'] con strcmp o un altra funzione di comparazione tra stringhe