Ik denk dat het matchen van wachtwoorden in de clientinterface thuishoort en nooit bij de server mag komen (DB-laag is al te veel). Het is beter voor de gebruikerservaring om geen server-roundtrip te hebben om de gebruiker te vertellen dat twee strings verschillend zijn.
Wat betreft dunne controller, dik model... al die zilveren kogels die er zijn, moeten worden teruggeschoten naar de maker. Geen enkele oplossing is in elke situatie goed. Beschouw ze allemaal in hun eigen context.
Door het idee van het dikke model hier te brengen, gebruik je een functie (schemavalidatie) voor een heel ander doel (wachtwoordovereenkomst) en wordt je app afhankelijk van de technologie die je nu gebruikt. Op een dag wil je van technologie veranderen en kom je op iets uit zonder schemavalidatie... en dan moet je onthouden dat een deel van de functionaliteit van je app daarop was gebaseerd. En je moet het terug naar de client of naar de controller verplaatsen.