Ich bin derzeit mit Unity mit Unity.Mvc3 in meiner MVC3-Anwendung, die Windows-Authentifizierung verwendet. Ich lese auch auf tun Dependency Injection und versuche, einen Ambient Context für einige Berechtigungsprüfung einrichten.
Ich habe eine abstrakte AuthorizeContext-Klasse mit einer statischen Eigenschaft Current, die eine von drei Implementierungen dieser Klasse enthält:
-
AuthorizeRoleContext, die für die Produktion verwendet wird, die eine Zeichenkette und ein IPrincipal durch Konstruktorinjektion annimmt und nur eine indirekte Ebene ist, um IPrincipal.IsUserInRole aufzurufen, wenn eine Anfrage oder Anforderung für die Autorisierung gemacht wird. Die injizierte Zeichenkette wird als Domänenpräfix für die Rolle verwendet.
-
AuthorizeContextAllowAll, das für die Entwicklung und manchmal für Tests verwendet wird und immer alle Anfragen und Autorisierungsanforderungen zulässt, wobei ein Standardkonstruktor verwendet wird.
-
AuthorizeContextAllowNothing, das zum Testen der minimal zulässigen Funktionalität verwendet wird und immer alle Genehmigungsanfragen ablehnt.
-
Fügen Sie in Zukunft noch eine weitere hinzu und überprüfen Sie die Berechtigung über eine Datenbank...?
So kann ich Dinge manuell verdrahten, indem ich (zum Beispiel in Application_BeginRequest):
AuthorizeContext.Current = new AuthorizeRoleContext(HttpContext.Current.User);
und rufen dann
AuthorizeContext.Current.Demand("someRole");
Dies funktioniert gut, aber ich bin auf der Suche nach der richtigen Art und Weise (und Ort), um es mit Unity zu verdrahten, während die Service-Locator Anti-Muster zu vermeiden. Also meine Frage ist: wie mache ich das?
Einige der Herausforderungen, die ich bisher mit der Unity-Registrierung hatte:
- Ich habe keine HttpContext.Current.User bei Application_Start, so kann ich es nicht in AuthorizeRoleContext zu diesem Zeitpunkt injizieren
- Ich weiß nicht, wie ich der statischen Eigenschaft AuthorizeContext.Current eine Implementierung zuweisen kann
Jetzt vielleicht sollte ich nur tun [Authorize(Roles = "Role1")] überall und lassen Sie MVC3 seine Sache tun, aber:
- Ich verwende es auch zum Aufbau meiner Speisekarte und möchte es vielleicht auch an anderen Stellen zur Berechtigungsprüfung einsetzen.
- Ich möchte die Berechtigungsprüfung durch andere Implementierungen (z. B. allow all) ersetzen, damit ich nicht jedem Entwickler/Tester Windows-Gruppen zuweisen muss.
- Ich scheine ein Domänenpräfix für die Rolle mit IPrincipal.IsUserInRole verwenden zu müssen, oder es wird nicht über Dev/Test/Production funktionieren. Natürlich ist die Produktion in der Kundenumgebung, mit völlig anderen Domänennamen. Das ist der Grund, warum ich den Domänennamen konfigurierbar gemacht habe und ihn injiziere.
- Ich möchte die Dinge als Einheit testen.
Aber vielleicht bin ich damit immer noch auf dem falschen Weg und arbeite an Problemen herum, die gar nicht da sind :)