Ce code existe pour vous permettre de placer à la fois [OutputCache] et [Authorize] ensemble sur une action sans courir le risque d'avoir une réponse qui a été générée pour un utilisateur autorisé mis en cache et servi à un utilisateur non autorisé.
Voici le commentaire du code source de AuthorizeAttribute.cs:
Puisque nous l'autorisation d'effectuer au niveau d'action, l'autorisation code est exécuté après la mise en cache du module de sortie . Dans le pire des cas, cela pourrait permettre à un utilisateur autorisé de mettre en cache la page , puis un utilisateur non autorisé sera plus tard mis en cache sur la page. Nous travaillons ce en disant fondés de pouvoir mettre en cache la page sensible, nous accrocher notre code d'autorisation personnalisée dans le mécanisme de mise en cache afin que nous ayons le dernier mot sur une page doit être servi à partir du cache.
Alors, que fait cet attribut? Il désactive d'abord la mise en cache du proxy de cette réponse, car les proxys ne peuvent pas déterminer correctement quels utilisateurs sont ou ne sont pas autorisés à l'afficher. Et si un proxy sert la réponse à un utilisateur non autorisé, c'est une très mauvaise chose.
Maintenant, qu'en est-il de AddValidationCallback? Dans ASP.NET, le module de mise en cache de sortie connecte les événements qui exécutent avant le le gestionnaire HTTP. Comme MVC est vraiment un gestionnaire HTTP spécial, cela signifie que si le module de cache de sortie détecte que cette réponse a déjà été mise en cache, le module servira simplement la réponse directement à partir du cache sans passer par le pipeline MVC. Ceci est également potentiellement une très mauvaise chose si le cache de sortie sert la réponse à un utilisateur non autorisé.
maintenant un coup d'oeil de plus près CacheValidateHandler:
private void CacheValidateHandler(HttpContext context, object data, ref HttpValidationStatus validationStatus) {
validationStatus = OnCacheAuthorization(new HttpContextWrapper(context));
}
// This method must be thread-safe since it is called by the caching module.
protected virtual HttpValidationStatus OnCacheAuthorization(HttpContextBase httpContext) {
if (httpContext == null) {
throw new ArgumentNullException("httpContext");
}
bool isAuthorized = AuthorizeCore(httpContext);
return (isAuthorized) ? HttpValidationStatus.Valid : HttpValidationStatus.IgnoreThisRequest;
}
Cela associe efficacement juste la méthode AuthorizeCore avec la réponse en cache. Lorsque le module de cache de sortie détecte une correspondance, il réexécute la méthode AuthorizeCore pour s'assurer que l'utilisateur actuel est autorisé à voir la réponse mise en cache. Si AuthorizeCore renvoie true, il est traité comme un hit de cache (HttpValidationStatus.Valid) et la réponse est diffusée à partir du cache sans passer par le pipeline MVC. Si AuthorizeCore renvoie la valeur false, il est traité comme un cache missing (HttpValidationStatus.IgnoreThisRequest) et le pipeline MVC s'exécute comme d'habitude pour générer la réponse. En outre, étant donné qu'un délégué est formé à AuthorizeCore (capturant ainsi l'instance particulière de AuthorizeAttribute) et sauvegardé dans un cache statique, c'est pourquoi tous les types sous-classes AuthorizeAttribute doivent être thread-safe.
qu'en pensez-vous? –
Eh bien, je suppose que c'est mettre en cache pour .. le contexte .. qui signifie alors la réponse. Mais, cet âge est .. maintenant? et je ne comprends pas ce que ce rappel est/fait/comment ou quand il a tiré. –