2010-05-14 4 views
6

Ich bin nur ein Neuling in ASP.NET MVC und bin mir nicht sicher, wie man eine bestimmte Aufgabe "den richtigen Weg" erreicht.ASP.NET MVC AuthorizeAttribute Übergabe von Werten an ActionMethod?

Im Wesentlichen speichern ich die angemeldete userId in HttpContext.User.Identity und haben eine EnhancedAuthorizeAttribute geschrieben, um einige benutzerdefinierte Autorisierung durchzuführen.

In der Methode overriden OnAuthorization trifft mein Domänenmodell die Datenbank, um sicherzustellen, dass die aktuelle Benutzer-ID auf den übergebenen routeValue "BatchCode" zugreifen kann. Der Prototyp ist:

ReviewGroup GetReviewGroupFromBatchCode(string batchCode); 

Es wird null zurück, wenn der Benutzer nicht die ReviewGroup und die OnAuthorization zugreifen können dann verweigert den Zugriff.

Jetzt weiß ich, dass die dekorierte Aktionsmethode nur ausgeführt wird, wenn OnAuthorization besteht, aber ich möchte die Datenbank nicht ein zweites Mal treffen, um die ReviewGroup wieder zu bekommen.

Ich denke über das Speichern der ReviewGroup in HttpContext.Items["reviewGroup"] und Zugriff auf diese von der Steuerung im Moment.

Ist das eine machbare Lösung, oder bin ich auf dem falschen Weg?

Danke!

Antwort

1

Das HttpContext.Items ist nur für die Dauer der Anforderung aktiv. Wenn Sie es für eine längere Zeit bestehen bleiben wollen, sollten Sie ihn in

a) Sitzung - gute

b) Profil - dont den Vorteil

c) Cookie sehen - nicht zu empfehlen

d) die Datenbank jedes Mal drücken - sollte OK sein

In filterContext.RouteData.DataTokens speichern?

+0

Nun, nein, ich brauche das Objekt ReviewGroup nicht für mehr als eine einzige Anfrage. Wirklich, alles, was ich brauche, ist, dieses Objekt (erhalten in der AuthorizeAttribute.OnAuthorization()) an die ActionMethod() zu übergeben. –

0

Es sei denn, Sie tun eine sehr große Auswahl aus ReviewGroup oder Sie haben eine enorme Datenbank, dann wäre ein zweiter Datenbank-Hit kein allzu großes Problem. Moderne Datenbanken sind sehr effizient bei der Auswahl, insbesondere bei ordnungsgemäß indizierten Tabellen.

Meiner Erfahrung nach ist dies der beste Weg, Autorisierung und eine ähnliche Methode zu machen, wie ich bestimmte Aktionen in meinen Anwendungen autorisierte.

Kurz gesagt, ich würde mir keine Sorgen über den zweiten Datenbanktreffer machen.

1

Alternativ ist eine der besten Möglichkeiten, um zu vermeiden, die Datenbank zu treffen, und am einfachsten Caching. Abrufen, stecken Sie es in einen Cache. Wenn es wieder benötigt wird, ist es bereits im Speicher und kein DB-Treffer ist erforderlich. Wenn nicht, dann wird das Objekt, wenn der Cache seinen Gültigkeitsbereich verlässt.

Verwandte Themen