Autorisation et mise en cache ASP.NET MVC

Je suis confus sur la mise en cache et l’autorisation ASP.NET MVC et j’ai vraiment besoin de clarification.

Mon atsortingbut d’autorisation créé par moi-même hérite de AuthorizeAtsortingbute . Sa méthode AuthorizeCore substituée s’exécute à chaque fois, même si je définis un atsortingbut [OutputCache] sur une action du contrôleur. Je comprends cette partie.

Maintenant, l’esprit pour moi: AuthorizeCore échouera à chaque fois que je vais effectivement mettre en cache la sortie et que la page est servie à partir du cache. La raison en est que lorsque la demande est mise en cache, la httpContext.Session fournie avec AuthorizeCore est null ! Voici un code simplifié:

 protected override bool AuthorizeCore(HttpContextBase httpContext) { return (Session["userId"] != null) } 

Donc, si httpContext.Session est null , cela échoue évidemment à chaque fois. Je dois cependant accéder à la session. Sinon, comment puis-je vérifier si la demande est autorisée? Cela n’a aucun sens – si tel est le cas, je ne pourrai jamais utiliser les pages en cache avec l’authentification dans ASP.NET MVC. Aidez-moi?

Il y a deux questions distinctes:

  1. L’authentification fonctionne-t-elle avec la mise en cache dans MVC?
  2. Session fonctionne-t-il avant l’authentification en présence d’un cache (même pour les utilisateurs non authentifiés, qui ont encore une session, espérons-le, unique)?

Les réponses, respectivement, sont oui et non. L’authentification fonctionne bien avec la mise en cache. Essayez-le avec les fournisseurs d’appartenances SQL ou Domain. tu verras.

La mise en cache, cependant, peut s’exécuter avant le module d’authentification. (Pour les points bonus: Pourquoi?) L’authentification n’est appelée que si elle accroche spécifiquement le cache (comme le fait AuthorizeAtsortingbute). Comme les sessions sont spécifiques à l’utilisateur, rien ne garantit que vous disposerez d’une session dans AuthorizeCore.

Davantage de points bonus: comment cela pourrait-il changer si vous avez spécifié un groupeIndifférentByUser dans votre configuration de cache?

Malheureusement, l’authentification est difficile, car il est difficile de définir un droit de sécurité. Microsoft tente de simplifier les choses avec l’API du fournisseur d’appartenance. Je recommande fortement de l’utiliser lorsque vous implémentez une authentification personnalisée. Je recommande également d’utiliser les fournisseurs intégrés et de les étendre au lieu de les réécrire autant que possible.

Un autre point: le fournisseur de session ASP.NET et le fournisseur d’appartenance ASP.NET sont entièrement séparés. Différents utilisateurs d’appartenance peuvent partager (!) Une session et, oui , vous pouvez attaquer un site de cette façon. Il n’est jamais sûr de mettre des informations relatives à la sécurité dans une session. La sécurité est difficile.