Wird der Rollenanbieter pro Anforderung zwischengespeichert?

8

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).

    
Appetere 12.12.2012, 14:48
quelle

1 Antwort

6

Wenn Sie RoleProvider in einer ASP.NET- oder ASP.NET MVC-Anwendung verwenden, verweist HttpContext.User auf eine RolePrincipal , 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 HttpContext.User auf die interne Klasse System.ServiceModel.Security.RoleProviderPrincipal , die keine Rollen zwischenspeichert: Stattdessen ruft sie immer RoleProvider.IsUserInRole 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 HttpContext.Items , führt also eine Abhängigkeit von der Existenz von HttpContext 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 RoleProvider in der web.config konfigurieren, müssen Sie nichts mehr tun, damit das Attribut Authorize sie verwendet.

    
Joe 12.12.2012, 14:55
quelle