Meine MVC-Anwendung nutzt die Rolle eines Benutzers an mehreren Stellen während einzelner Seitenanforderungen. Meine Frage ist, ob der Standard-SqlRoleProvider die aktuellen Benutzerrollen für die Lebensdauer einer Seitenanforderung zwischenspeichert?
Zum Beispiel verwende ich Rollen in Attributen auf Controller-Methoden:
%Vor%und benutzerdefinierter Code
%Vor%Wenn der Rollenanbieter keine Rollen zwischenspeichert, ist die beste Lösung, einen benutzerdefinierten Rollenanbieter zu schreiben, der von dem Standardrollenserver erbt, und überschreibt die Methoden zum einmaligen Abrufen der Rollen und zum Zwischenspeichern für die Dauer der Anforderung. Kann dies auf eine Weise geschehen, dass sowohl das Attribut "Autorisieren" als auch mein eigener Code die zwischengespeicherten Rollen verwenden?
(Falls Sie sich fragen, möchte ich die cacheRolesInCookie web.config-Option nicht verwenden, um die Rollen in Cookies zwischenzuspeichern).
Vielen Dank im Voraus für Anregungen.
[Bearbeiten, um Details aus Joes Antwort hinzuzufügen]
Ich habe System.Web.Mvc.AuthorizeAttribute dekompiliert, und die AuthorizeCore-Methode ruft die folgende Methode für jede zu prüfende Rolle auf:
%Vor%Wenn Sie dann in System.Web.Security.RolePrincipal (was "User" oben ist) eintauchen, verwenden beide Methoden tatsächlich eine zwischengespeicherte Kopie der Rollen des Benutzers (oder füllen den Cache, wenn sie leer sind):
%Vor%Der Cache wird als Feld auf Benutzer gespeichert, so dass seine Lebensdauer für die Dauer der Anfrage gilt.
Die Methoden finden die Rollen mit:
%Vor%verwendet also den Rollenanbieter, den Sie für die Anwendung ausgewählt haben (Standard oder benutzerdefiniert).
Wenn Sie %code% in einer ASP.NET- oder ASP.NET MVC-Anwendung verwenden, verweist %code% auf eine %code% , die Rollen für die Lebensdauer der Anforderung zwischenspeichert.
In einem WCF-Dienst, der ASP.NET-Rollen verwendet:
%Vor%Das ist nicht wahr: stattdessen verweist %code% auf die interne Klasse %code% , die keine Rollen zwischenspeichert: Stattdessen ruft sie immer %code% auf.
Die sofort einsatzbereiten RoleProvider führen kein Caching durch. Dies kann zu wiederholten Verbindungen mit dem zugrunde liegenden Datenspeicher führen. Es scheint mir ein Mangel zu sein: Es wäre einfach gewesen, die Rollen beim ersten Zugriff zu cachen.
ist die beste Lösung zum Schreiben eines benutzerdefinierten Rollenanbieters, der von dem Standardrollenserver erbt, und überschreibt die Methoden zum einmaligen Abrufen der Rollen und zum Zwischenspeichern für die Anforderungsdauer?
Nicht erforderlich für ASP.NET oder ASP.NET MVC, könnte aber für WCF vorgesehen werden. Caching für die Request-Dauer verwendet vermutlich %code% , führt also eine Abhängigkeit von der Existenz von %code% ein, aber das ist nicht unbedingt ein Problem, außer dass Unit-Tests schwieriger werden.
Kann dies auf eine Weise geschehen, dass sowohl das Autorisierungsattribut als auch mein eigener Code die zwischengespeicherten Rollen verwenden?
Wenn Sie Ihre benutzerdefinierte %code% in der web.config konfigurieren, müssen Sie nichts mehr tun, damit das Attribut %code% sie verwendet.