2009-08-26 9 views
1

J'ai un modèle utilisateur qui nécessite que l'utilisateur change son mot de passe tous les trois mois. J'ai besoin de vérifier en quelque sorte si l'utilisateur est connecté (nous autorisons les navigateurs anonymes sur certaines sections du site) et si leur mot de passe a expiré, forcez-les à en entrer un nouveau avant de pouvoir faire autre chose.Vérification des données utilisateur avant chaque action

La méthode brute-force consiste à ajouter un peu de code à chaque action (à l'exception de l'action ChangePassword dans Account). Par exemple:

var authenticatedUser = GetAuthenticatedUser(); 
if (authenticatedUser != null && authenticatedUser.IsPasswordExpired) 
    return RedirectToAction("Account", "ChangePassword"); 

De toute évidence, c'est une façon horrible de résoudre ce problème, mais je ne suis pas sûr de la bonne façon de le faire. Des idées? Je suis à peu près sûr que nous allons devoir ajouter plus de contrôles de données utilisateur comme celui-ci à l'avenir, donc j'aimerais vraiment trouver une bonne solution maintenant.

Répondre

4

Je fais l'authentification personnalisée dans ma classe de contrôleur de base (tous mes contrôleurs en dérivent). Vous pouvez remplacer la méthode protégée Controller.OnAuthorization. Notez que OnAuthorization est appelé après la méthode Controller.Initialize, donc si vous placez une autre logique personnalisée dans la méthode Initialize, souvenez-vous simplement qu'elle est appelée en premier.

/// <summary> 
    /// Called when authorization occurs. 
    /// </summary> 
    /// <param name="filterContext">Contains information about the current request and action.</param> 
    protected override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     // Do custom authentication here. 
     Authenticate(); 

     base.OnAuthorization(filterContext); 
    } 
+1

Cela ressemble à une bonne solution. Malheureusement, je serai absent de mon ordinateur pendant quelques jours et je ne pourrai pas l'essayer. Une question rapide - OnAuthorize est-il toujours appelé même si l'action n'utilise pas l'attribut Authorize? – Jason

+1

Oui, il sera toujours appelé. – jimr

+0

Est-ce que vous savez pourquoi cela ne se fait pas appeler sur les pages directes? – IronicMuffin

0

Vous pouvez écrire votre propre HttpModule et le valider une fois sur chaque requête. Vous pouvez dériver de HttpModule et le coller dans la section de configuration httpModules web.config.

Questions connexes