Ich habe eine MVC Core-Anwendung, die zwei Filter hat. Eine ist eine AuthorizeFilter
, um die Rollenmitgliedschaft zu überprüfen, und die andere ist eine ActionFilter
, die verifiziert, dass die Anwendung und die Datenbank synchronisiert sind.ASP.NET Core MVC ActionFilter Ausführen nach Autorisierung schlägt fehl
Startup.cs:
services.AddMvc()
.AddMvcOptions(options =>
{
options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder().AddRequirements(new RoleRequirement()).Build()));
options.Filters.Add(new DatabaseFilter());
})
Wenn ein Konflikt besteht die ActionFilter
eine Ansicht, die die Fehlermeldung angezeigt wird zurückgibt.
DatabaseFilter.cs:
public void OnActionExecuting(ActionExecutingContext context)
{
if (condition)
{
context.Result = new ViewResult
{
ViewName = "DbError"
};
}
}
RoleRequirement.cs:
protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, RoleRequirement requirement)
{
if (condition)
{
context.Succeed(requirement);
}
else
{
context.Fail();
}
return;
}
Was passiert ist, dass wenn eine nicht autorisierte Benutzer die Anwendung verwendet, wenn eine Datenbank Konflikt gibt, sie die gezeigt werden Datenbankfehleranzeige anstelle von 403 Forbidden Antwort wie sie würden, wenn es keinen Datenbankkonflikt gab. Ich würde es vorziehen, dass sie stattdessen die verbotene Nachricht erhalten.
According to the documentation, die AuthorizationFilter
Läufe vor dem ActionFilter
, aber es muss die Anfrage Kurzschließen auch nach Einstellung context.Fail()
nicht sein.
Können Sie "Entsprechend der Dokumentation" beziehen? – spottedmahn
Verweis auf die Dokumentation hinzugefügt. – Valuator