2013-09-27 4 views
7

Kann jemand erklären, warum der Autorisierungsattributlebenszyklus anscheinend relativ zu der Klasse oder Methode, auf die er angewendet wird, verwaltet wird? Dies ist im Gegensatz zur Verwaltung relativ zum Anforderungslebenszyklus.Berechtigungsattributlebenszyklus

Wenn ich einen Controller auf der Klassenebene dekoriere, wird der Autorisierungsattribut-Konstruktor nur einmal über mehrere Anfragen an denselben Controller aufgerufen. Wenn ich jede Controller-Methode dekoriere, dann erhalte ich für jede aufgerufene Controller-Methode neue Autorisiere-Attribut-Konstruktor-Aufrufe.

Worum geht es bei diesem Verhalten? Ich würde erwarten, dass die Autorisierung von Attributen bei jeder Anfrage erfolgt.

+0

Wie stellen Sie fest, dass es nur einmal aufgerufen wird, wenn es auf die Klasse angewendet wird? AFAIK, der Controller wird bei jeder Anfrage instanziiert und zerstört. Es muss * sein *, oder Sie würden mit einer übergreifenden Umweltverschmutzung enden. Es ist möglich, dass beim Debuggen in Visual Studio, dass es aus irgendeinem Grund umgeht, aber wenn Sie mit der gleichen Controller-Instanz für jede Anfrage auf echten IIS enden, dann gibt es ein Problem. –

+0

Chris, ich sprach nicht über den Lebenszyklus des Controllers. Ich frage vielmehr nach dem Lebenszyklus von AuthorizeAttribute. Das AuthorizeAttribute wird nicht für jede Anfrage erstellt und ich habe es erwartet. Leider führte dies zu einigen Problemen für diese aktuelle Anwendung, da wir die Rollen zur Laufzeit ändern müssen. – Daniel

Antwort

8

ASP.NET MVC wird ActionFilters zwischenspeichern und versuchen, sie bei nachfolgenden Anforderungen wiederzuverwenden. Die eigentliche Autorisierung erfolgt bei jeder Anfrage, aber der Contruktor wird nur beim ersten aufgerufen. Sie sollten keinen internen Status in einem ActionFilter beibehalten.