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[] { });