Ich versuche, ein Authentifizierungsattribut zu schreiben, das auf einige Dienste in einer WCF-Dienstanwendung angewendet werden soll (mit Unity und Unity.Wcf).
Die Authentifizierung wird von einer externen (zur Service-App) Authentifizierungsschnittstelle durchgeführt, die derzeit über die Konstruktionsinjektion in die Serviceklasse injiziert und direkt in jeder Servicemethode aufgerufen wird.
Dies führt zu einer Menge von wiederholtem Code in jeder der Service-Methoden.
Stattdessen möchte ich das zu einem Attribut verschieben.
Aber ich brauche die Authentifizierungsschnittstelle, auf die im Attribut zugegriffen werden kann.
Offensichtlich ist es dann ein erforderlicher Parameter, wenn ich meine Service-Methode mit dem Attribut dekoriere, aber ich habe zu diesem Zeitpunkt keinen Zugriff darauf, weil es von Unity verdrahtet ist. p>
Wie kann ich die Authentifizierungsschnittstelle in mein Attribut einfügen (oder anderweitig darauf zugreifen)?
Wenn Sie bereits Unity verwenden, würde ich AOP-Funktionen von Unity verwenden. Aspect Oriented Programing wurde entwickelt, um eine einfache, DRY-Implementierung von Code zu ermöglichen, um Cross-cutting-Probleme (wie Authentifizierung und Autorisierung) zu behandeln. Dies ermöglicht es, doppelten Code loszuwerden und auch cross-cutting-concern von der Geschäftslogik zu entkoppeln. Sie können auf einfache Weise Abhängigkeiten in Aspekte einbinden, die mit Unity erstellt wurden, da sie in der Laufzeit vom Container aufgelöst werden (dynamisches Abfangen).
Um einen Aspekt mit Einheit zu erstellen, implementieren Sie einfach IInterceptionBehavior
interface und wenden Sie ihn auf den Dienst an, den Sie während der Containerregistrierung nicht dekorieren werden (Anweisungen hier ).
Innerhalb des Aspekts können Sie alle Attribute, die auf die abgefangene Methode angewendet werden, leicht lesen, sodass Sie Rollen, die für Ihr Authentifizierungsszenario erfüllt sein müssen, in das Attribut einfügen können (aber kein Verhalten).
Ich habe eine Demo-Lösung erstellt, um AOP zu erklären, es verwendet CastleWindsor nicht Unity, aber es gelten die gleichen Prinzipien.
Tags und Links wcf c# attributes dependency-injection unity-container