Rollen-Caching-Strategien in ASP.NET MVC

8

Wir haben eine ASP.NET MVC-Anwendung, für die wir eine eigene benutzerdefinierte RoleProvider-Klasse entwickelt haben. Ohne Zwischenspeicherung wird für jede Anforderung auf den Datenspeicher zugegriffen - schlecht. Die einzige Caching-Option, die wir finden können, ist (in web.config) über Cookies, die auf den Maschinen des Clients gespeichert sind. Meine zwei Fragen sind:

  1. Ist das sicher (auch bei aktivierter Verschlüsselung)?
  2. Werden die Cookie-Informationen mit jeder Webanfrage übertragen - wodurch die Anwendung möglicherweise mehr als nur der Zugriff auf den Datenspeicher verlangsamt wird?

Hat jemand eine alternative Route? Ich verstehe, dass das Zwischenspeichern dieser Informationen in der Sitzung auch schlecht ist?

    
Chris Arnold 02.11.2009, 11:17
quelle

3 Antworten

6

Wenn Sie Ihre eigene benutzerdefinierte RoleProvider-Klasse entwickelt haben, können Sie Ihr eigenes Daten-Caching durchführen, z. Verwenden des ASP.NET-Caches. Dies ist flexibler als die Verwendung von Session als Cache, da dies auch auf Seiten funktioniert, auf denen der Sitzungsstatus nicht aktiviert ist.

Ich stimme Wyatt Barnetts Kommentar nicht zu:

  

Der Nachteil für die Verwendung der Sitzung   ... die Tatsache, dass Session-Speicher ist   sehr verletzen und nicht besonders   zuverlässig

Es ist in Ordnung, wenn ein Cache (ob Sitzung, ASP.NET-Cache oder etwas anderes) flüchtig ist - Sie müssen ihn nur bei Bedarf neu auffüllen.

Um Ihre Fragen zu beantworten:

  1. Es ist so sicher wie die Verschlüsselung, die zum Verschlüsseln des Cookies verwendet wird. Wenn Sie auf FormsAuthentication vertrauen, muss es nicht weniger sicher sein als das Formularauthentifizierungsticket.

  2. Der Cookie wird bei jeder Anfrage übertragen. Es gibt also eine potenzielle Leistungseinbuße, wenn Benutzer eine sehr große Anzahl von Rollen haben können und die maximale vom Browser unterstützte Cookie-Größe überschreiten kann.

Joe 02.11.2009, 20:25
quelle
2

Zwar ist die Idee, dass jede Anfrage ineffizient ist, wahr, aber bedenken Sie, dass die SELECT-Leistung bei richtig indizierten Tabellen in modernen Datenbanken unglaublich schnell ist. Daher würde ich zunächst einige Messungen durchführen, um sicherzustellen, dass dieses Szenario die Leistung negativ beeinflusst im Vergleich zu theoretisch könnte die Leistung zu einem späteren Zeitpunkt negativ beeinflussen.

Der Nachteil bei der Verwendung der Sitzung ist nicht so sehr der Overhead (minimal) als die Tatsache, dass der Sitzungsspeicher sehr verletzt und nicht besonders zuverlässig ist. Sie können die Sitzung zum Beispiel verlieren und trotzdem einen angemeldeten Benutzer haben.

Das heißt, ein guter Weg, hier in der Mitte zu bleiben, wäre, die Benutzerrollen pro Anfrage mit der HttpContext.Items-Sammlung zwischenzuspeichern. Dies wird auf einen SELECT pro Anfrage begrenzt, was wahrscheinlich ziemlich effizient ist (siehe oben), während die anderen Speicherprobleme vermieden werden - wie etwa ein fetter, unsicherer Cookie oder eine eher sitzungsbasierte Lösung.

    
Wyatt Barnett 02.11.2009 16:51
quelle
2

Die Cookie-Informationen werden tatsächlich bei jeder Anfrage vom Browser an Ihren Webserver gesendet. So funktionieren Cookies genau, aber solange die Größe des Cookies vernünftig ist, sollte es keine allzu großen Auswirkungen haben Performance. Wenn Sie die Formularauthentifizierung verwenden, würde ich empfehlen, die Rollen im Formularauthentifizierungs-Cookie zu speichern, wie in beschrieben Dieser Blogbeitrag In diesem Fall fügen Sie nur Daten zu einem bereits vorhandenen Cookie hinzu. Sie sollten sich darüber im Klaren sein, dass die Menge der Daten, die Sie in diesem Cookie speichern können, nach oben begrenzt ist, wie in hier .

    
MadMax1138 02.11.2009 20:12
quelle