2009-08-06 5 views
0

Supposons que je ne souhaite pas utiliser Membership et que vous souhaitiez restreindre l'accès de l'utilisateur à ActionFilter.Vérifiez les détails de l'utilisateur dans ASP.NET MVC ActionFilter

Je sais que je peux créer un filtre/attribut et remplacer la méthode OnActionExecuting et plus loin je peux mettre cet attribut dans un ActionResult. Et supposons que j'ai une table nommée 'tbUsers', il y a aussi un champ int nommé 'certificate' et en fonction de cette valeur 'certificate', un utilisateur peut accéder à un ActionResult ou non. Mais, comment puis-je, dans un mehod OnActionExecuting, vérifier la valeur 'certificate' de cet utilisateur et accorder son accès ou rediriger vers une page 'NotAllowed.aspx'?

Merci !!!

Répondre

1

Le champ ActionExecutingContext possède le HttpContext qui inclurait l'objet Utilisateur en cours. Vous pouvez l'utiliser pour obtenir l'utilisateur. Vous pouvez également l'utiliser pour accéder à la session si vous souhaitez stocker les informations dans la session. Vous pouvez également le mettre dans un cookie chiffré et y accéder via le Request.Cookies sur le contexte. Vous voudriez penser aux implications de sécurité de cela, bien que je ne le vois pas comme étant plus problématique que le cookie d'authentification.

La vérification par rapport à la base de données et le maintien de la testabilité sur votre filtre sont un peu plus compliqués. Ce que j'ai fait est de fournir deux constructeurs pour chaque classe de filtre. L'un fournit une fabrique de base de données qui créera mon contexte de données. J'utilise ceci dans le test et fournissons une usine de base de données de simulation qui produit une fausse base de données ou fausse. Le constructeur normal, sans paramètre, appelle le constructeur précédent avec une fabrique nulle. Lorsque cela se produit, l'autre constructeur crée une nouvelle instance de la fabrique par défaut.

private IDatabaseFactory Factory { get; set; } 
public MyFilter(IDatabaseFactory factory) 
{ 
    this.Factory = factory ?? new DefaultDatabaseFactory(); 
} 

public MyFilter() : this(null) { } 
4

Je ne le ferais pas de cette façon. Je voudrais implémenter un IAuthorizationFilter. Les filtres d'autorisation s'exécutent avant tous les filtres d'action. Par exemple, supposons que vous ayez par la suite mis un attribut OutputCache sur la méthode d'action et qu'il soit exécuté avant votre filtre d'authentification. Ce serait mauvais! Si le contenu est mis en cache, le filtre d'authentification ne sera jamais exécuté et les utilisateurs verront les données sensibles mises en cache.

Questions connexes