Die Attribute [OutputCache] und [Autorize] spielen gut miteinander. Die AuthorizeAttribute.OnAuthorization() -Methode setzt einen Hook in das Ausgabe-Caching-System, das den Autorisierungsfilter erneut ausführen muss, bevor die Seite aus dem Cache bereitgestellt wird. Wenn die Autorisierungsfilterlogik fehlschlägt, wird sie als Cache-Fehltreffer behandelt. Wenn die Autorisierungslogik erfolgreich ist, wird die Seite aus dem Cache bedient. Wenn Sie also [Autorisieren (Rollen = "Moderator, Administrator")] und [OutputCache] für eine Aktion ausgewählt haben, wird die Seite nicht aus dem Cache bereitgestellt, es sei denn, der aktuelle Benutzer befindet sich in der Moderator- oder Administratorrolle.
Beachten Sie, dass diese nicht je nach Benutzer oder Rolle variieren kann; es führt buchstäblich den ursprünglichen Scheck erneut aus. Stellen Sie sich vor, dass Benutzer A (der ein Moderator ist) hereinkommt und bewirkt, dass die Seite zwischengespeichert wird. Jetzt kommt Benutzer B (der ein Administrator ist) herein und trifft die zwischengespeicherte Seite. Die Prüfung [Autorisieren] ist erfolgreich, da sowohl Administrator als auch Moderator zulässig sind und die Antwort an Benutzer B enthält die exakt denselben Inhalt als die Antwort, die Benutzer A zugestellt wurde. Beachten Sie, dass die Antwortsubstitution dies nicht tut arbeiten in MVC 2. Wenn Sie potenziell sensible Daten bereitstellen, ist es am besten, sie nicht zwischenzuspeichern. Wenn Sie unbedingt zwischenspeichern müssen, können Sie ähnlich wie bei der Antwortsubstitution einen AJAX-Rückruf verwenden, um die fehlenden Daten dynamisch auszufüllen.
Was ist, wenn ich eine Methode habe, die keine Autorisierung erfordert, aber einen Edit-Link in der Ansicht hinzufügt, wenn der Benutzer ein Moderator ist? In diesem Fall versuche ich, etwas zu erreichen, das aussieht, wie die Link-, Flag-, Edit- und andere Schaltflächen unter einer Frage oder Antwort hier funktionieren - verwendet SO nicht auch OutputCache? Danke für deine Antwort! –
Ich stolperte gerade über http://blog.stevensanderson.com/2008/10/15/partial-output-caching-in-aspnet-mvc/ (über ein altes Problem, das später behoben wurde), die mir eine Idee gab - Wenn OutputCache damit so schlecht ist, ist es möglich, ** ein benutzerdefiniertes Caching-Attribut/Filter zu erstellen **, das verschiedene Kopien erstellt, je nachdem, ob der Benutzer angemeldet ist und welche Rollen der Benutzer hat - oder besser noch, was Benutzername ist, wie ich den Namen des Benutzers oben auf der Seite schreiben werde - ** ist das möglich **? –
Es ist im Allgemeinen eine schlechte Idee, pro Benutzer zu cachen, da Ihr Cache mit Einträgen überschwemmt wird. Wenn das Donut-Caching für Ihr Szenario wichtig ist, können Sie auch einen Antwortfilter verwenden. Installieren Sie zu Beginn der Anfrage einen Filter, der einige [!! SUBSTITUTION DATA !!] pattern, lassen Sie Ihr WriteSubstitute() dieses Muster in den Antwortstream schreiben, dann würde Ihr Filter am Ende der Anfrage die eigentliche Response.WriteSubstitution() -Methode aufrufen. – Levi