Bei den meisten meiner APIs mache ich einfach eine Autorisierung wie folgt:
[Authorize(Policy = "Foo")]
public MyApi()
Ich erhalte diese Richtlinie jedoch von einem NuGet und kann sie nicht ändern.
Für einige meiner APIs möchte ich diese Richtlinie nicht immer haben. Dies muss zur Laufzeit anhand einer Konfiguration herausgefunden werden. Ich möchte eine Möglichkeit haben, dies inline auszuführen und sicherzustellen, dass alle Handler, die eingerichtet werden, ausgeführt werden.
Nach langem Suchen habe ich festgestellt, dass ich eine erstelle IAuthorizationService
und diese zum Aufrufen verwende AuthorizeAsync
. Dies scheint das zu sein, was ich will, aber das Problem, auf das ich jetzt stoße, ist, dass sich alle Handler auf a AuthorizationFilterContext
als Ressource für den Kontext verlassen. Dies scheint automatisch zu geschehen, wenn die Autorisierung über das Attribut erfolgt, jedoch nicht über den Aufruf von AuthorizeAsync. In diesem Fall muss es manuell übergeben werden. Mein Code sieht jetzt so aus:
public MyApi()
{
var allowed = await _authorizationService.AuthorizeAsync(User, null, "Foo").ConfigureAwait(false);
}
Dies scheint alle meine Handler korrekt zu durchlaufen, aber sie funktionieren nicht, weil die fehlen AuthorizationFilterContext
.
1) Ist dies zunächst der richtige Ansatz oder gibt es eine andere Möglichkeit, dies inline zu tun? Ich vermute, es gibt wahrscheinlich eine Möglichkeit, meine eigene Richtlinie zu erstellen, die diese umschließt, und ich kann die Konfiguration dort überprüfen, aber wenn es einen einfachen Inline-Ansatz gibt, würde ich das vorziehen.
2) Wenn dieser Weg gültig ist, gibt es einen guten Weg, um das zu bekommen AuthorizationFilterContext
? Ich habe versucht, es manuell zu erstellen, aber ich befürchte, dass dies nicht korrekt ist, ohne mehr Daten aus dem Kontext zu übergeben, aber ich kann keine guten Beispiele / Dokumente finden:
new AuthorizationFilterContext(new ActionContext(HttpContext, HttpContext.GetRouteData(), new ActionDescriptor()), new IFilterMetadata[] { });
quelle
Antworten:
Es wird keine geben,
AuthorizationFilterContext
wenn Sie sich außerhalb der Autorisierungspipeline befinden. Sie sollten daher die Authentifizierung nicht inline mit behandelnIAuthorizationService
.Klingt so, als hätten Sie die Kontrolle über die Authentifizierungshandler. Haben Sie versucht, die Kurzschlussauthentifizierung im Handler durchzuführen, wenn dies nicht erforderlich ist?
Der Handler kann Dienste über den DI abrufen, sodass Sie Ihre erforderliche Laufzeitkonfiguration über IOptions oder IHttpContextAccessor und was auch immer eingeben können .
quelle
Können Sie kein eigenes
Authorize
Attribut erstellen , das das aktuelle erbt und die Richtlinie intern auflöst? Oder noch besser versuchenIAuthorizationPolicyProvider
Dies ist nicht getestet, aber Sie können hier mehr darüber finden .
quelle
Ihre Überprüfungsbedingung scheint zu einem späteren Zeitpunkt zu geschehen, was ich nicht für eine gute Idee halte. Ihre API-Methode ist anfällig und immer noch offen, da Ihre Überprüfung zu einem späteren Zeitpunkt durchgeführt wird. Mit dem Attribut können Sie es jedoch auf einer früheren Ebene erfassen und dennoch die benutzerdefinierte Logik anwenden. Am Ende des Tages entscheidet alles, was es entscheidet, entweder "Ja, Zugang haben" oder "Nein, kein Zugang für Sie !!" Das Folgende ist nicht getestet, sollte Sie aber zum Laufen bringen:
quelle