Wie stecken die Parameter der Methode in benutzerdefinierten Attributs
Habe ich ein benutzerdefiniertes Attribut mit dem Namen AuthoriseAttribute, dessen Konstruktor sieht wie folgt aus:
public AuthoriseAttribute(int userId)
{
.. blah
}
Diese verwendet wird, mit einer Methode namens GetUserDetails()
wie diese:
[Authorise(????????)]
public UserDetailsDto GetUserDetails(int userId)
{
.. blah
}
Zur Laufzeit, die Anwesenheit von der Genehmigen-Attribut bewirkt, dass einige authorisation code auszuführen, benötigt die Benutzer-ID des Benutzers. Offensichtlich kann dieser entnommen werden die parameter der GetUserDetails()
Methode, aber dies bedeutet, dass der Autorisierungscode, hängt von der Methode der parameter mit einem bestimmten Namen.
Möchte ich weitergeben kann, in der der tatsächliche Wert des userId
parameter in das Attribut, so dass die Genehmigung-code arbeitet mit den übergebenen Wert in dem Attribut (also nicht die Methode, parameter), deren name bekannt ist.
Etwas wie dieses (was nicht funktioniert):
[Authorise(userId)]
public UserDetailsDto GetUserDetails(int userId)
{
.. blah
}
Ist so etwas möglich?
Es ist etwas, das ich nicht verstehen - warum würden Sie wollen, um zu autorisieren, einen parameter einer Methode? IMO - Sie müssen zulassen, dass der Aufrufer der Methode - ist dies richtig?
Was Sie beschreiben, kann nicht direkt geschehen, da bin ich mir sicher, dass der compiler-Fehler, erzählt Sie. Es wäre hilfreich zu wissen, wie "die Anwesenheit von den Genehmigen-Attribut bewirkt, dass einige authorisation code ausführen" funktioniert. Sie sollten in der Lage sein, den code dort anschauen der parameter "userId".
Anstatt die Benutzer-info in jede Methode, könnten Sie die Attribut bekommen es durch andere Mittel, wie die WCF-Kontext, oder aus Active Directory... Dann Ihre Methoden sind sauber und nicht mehrere Aufgaben.
Danke Jungs. @Tim: ich bin mit Schloss Windsor abfangen. Das Vorhandensein des Attributs bewirkt, dass die Methode invocation abgefangen werden und mir erlaubt, code auszuführen, bevor der Aufruf. Ich habe Zugriff auf die Methode info und der Attribut-info. Ich brauche, um die Benutzer-ID des Benutzers (und andere Sachen, aber ich halte die Frage einfach), aber es gibt keinen einfachen Weg, zu sagen, die Abfangjäger, wo die Benutzer-ID. Es könnte sein, übergeben der Methode einen int-parameter namens
userId
sein, oder es könnte sein, begraben tief in eine komplexe Typ-parameter.InformationsquelleAutor David | 2012-05-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Machen vcsjones' Kommentar eine Antwort, dies ist nicht möglich.
Attribute sind Metadaten; Sie sind zusammengestellt in der Versammlung zur compile-Zeit, und ändern sich nicht während der Laufzeit. Als solche, alle Parameter, die Sie übergeben, in ein Attribut müssen die Konstanten; Literale, Konstante, Variablen-compiler definiert, etc.
Die eine Art, dies würde die Arbeit zu machen, ist das Attribut eine AOP-element, die Verwendung eines Frameworks wie PostSharp oder Rollen Sie Ihre eigenen mit dem Unity-Framework etc. Dies würde es ermöglichen, Sie zu befestigen "Abfangjäger" an die Methode, indem dekorieren es mit einem Attribut, das dann führen Sie den code in das Attribut und wird auch das wissen über genau, wie die Methode aufgerufen wurde, einschließlich von parameter-Werten. Schauen Sie sich dieses blog: http://www.progware.org/Blog/post/Interception-and-Interceptors-in-C-(Aspect-oriented-programming).aspx
Ich würde nicht sagen, es ist Diebstahl. +1 für meinen Kommentar und verwandelt Sie in eine nützliche Antwort.
+1 für einen guten sport.
Sie würde wahrscheinlich geben Sie diese Informationen, indem Sie den Namen des Parameters, den Sie verwenden würden, als ein string:
[Authorize("userId")]
. Wenn der interceptor, die Sie definiert haben, ausgeführt wird, sollte in der Lage sein, zu prüfen, Metadaten über den Aufruf der Methode, die vorgenommen wurde, um es zu lösen, und sollte in der Lage sein zu finden, die den parameter mit dem angegebenen Namen und geben Ihren Wert zu welcher code ausgeführt werden soll, basierend auf diesem Attribut.Danke. Ja, ich dachte darüber nach. Ich bin mir nicht sicher, wie ich das funktioniert, wenn der parameter einen komplexen Typ. Ich hätte zu definieren, eine Art Zauber, den syntax für den Ausdruck der Lage die gewünschten Daten als string. Müssen diese Gedanken geben.
InformationsquelleAutor KeithS
Dort ist ein Weg, dies zu tun _im ASP.NET MVC_ mit action-Methoden (nicht mit Attributen im Allgemeinen)
InformationsquelleAutor Alex
War ich in der Lage, dies zu umgehen, mithilfe der folgenden:
Und dann auf die spezifischen Methoden, die Sie überprüfen möchten-Ids auf,
Und wenn Sie nicht kümmern, um zu überprüfen, Ihre Id, sondern nur, dass Sie authentifiziert sind
Natürlich können Sie organisieren Sie Ihre autorisieren Verfahren, wie du willst, aber diese Idee können Sie sich Ihre ID in Ihren auth-Verfahren gibt, da es übergeben wird, die als route-Daten.
Mehr hier: https://stackoverflow.com/a/16054886
InformationsquelleAutor Brian Davis