Ich habe eine ASP.NET MVC-Anwendung mit Autorisierungsattributen auf Controllern und Aktionen. Dies hat gut funktioniert, aber eine neue Falte hat sich gezeigt.ASP.NET MVC: Autorisierung innerhalb einer Aktion - Vorgeschlagene Muster oder das ist ein Geruch?
Objekt: Versand
Rollen: Versand, Buchhaltung, General User
Der Versand über einen Workflow bewegt. Im Zustand A kann es nur mit Versand bearbeitet werden. Im Zustand B kann es nur vom Rechnungswesen bearbeitet werden.
Ich habe eine ShipmentController und eine Edit Action. Ich kann ein Autorisierungsattribut setzen, um die Edit-Aktion auf nur diese beiden Rollen zu beschränken, aber dies unterscheidet nicht zwischen dem Status der Sendung. Ich müsste innerhalb der Aktion vor dem Serviceaufruf eine Autorisierung durchführen, um festzustellen, ob der Benutzer vorhanden ist ist wirklich berechtigt, die Bearbeitungsaktion auszuführen.
Also mit zwei Fragen, die ich bin links:
1) Was ist ein guter Weg Genehmigung innerhalb einer Aktion zu haben. Die Controller-Aktion ruft einen Service auf, und der Service führt dann entsprechende Aufrufe an das Sendungsobjekt aus (Aktualisierungsmenge, Aktualisierungsdatum usw.). Ich weiß ganz sicher, dass das Versandobjekt unabhängig von Autorisierungsanforderungen sein soll. Auf der anderen Seite habe ich kein wirkliches Verständnis, wenn ich möchte, dass das Dienstobjekt über die Berechtigung informiert wird oder nicht. Gibt es dafür gute Muster?
2) Ist mein Problem tatsächlich ein Symptom für schlechtes Design? Anstelle von ShipmentController sollte ich einen StateAShipmentController und einen StateBShipmentController haben? Ich habe keinen Polymorphismus im Shipment-Objekt (der Status ist nur ein Enum), aber vielleicht sollte ich das und vielleicht sollten die Controller das reflektieren.
Ich denke, ich bin nach allgemeineren Lösungen, nicht eine bestimmte für meinen Fall. Ich wollte nur ein Beispiel geben, um die Frage zu veranschaulichen.
Danke!
Warum nicht einen eigenen [Authorize] -ähnlichen Aktionsfilter für den Versand erstellen? –
Erstellen Sie Ihre eigenen [Autorisieren] Filter wäre eine wirklich, wirklich schlechte Idee, und es ist eine, die das ASP.NET MVC-Entwickler-Team hat wirklich wirklich wirklich davon abgeraten –
@Josh; Ich bin nicht einverstanden. Es ist keine "wirklich, wirklich schlechte Idee", es ist nur eine, die mit der gebotenen Sorgfalt angegangen werden sollte. Ich habe keine öffentlichen Artikel über Entmutigung gesehen, geschweige denn mit 'wirklich' und 'stark'. Das einzige wirkliche "Gotcha" von meinem Wissen ist, dass Sie von dem vom Framework bereitgestellten Authorize-Attribut erben möchten, weil Sie auf diese Weise sicherstellen können, dass es zuverlässig an der richtigen Stelle ausgelöst wird. – Paul