2017-10-17 5 views
1

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.

+0

Können Sie "Entsprechend der Dokumentation" beziehen? – spottedmahn

+1

Verweis auf die Dokumentation hinzugefügt. – Valuator

Antwort

0

Nach dem Zurückgehen wurde es offensichtlich. Der Autorisierungsfilter ist, der die Anforderung kurzschließt ..., die dann zu einer Fehlercontrolleraktion führt, um eine benutzerdefinierte 403-Seite zurückzugeben. Der Fehlercontroller hat keine Berechtigung, daher fällt er auf den DatabaseFilter, der den Mismatch-Fehler wie erwartet zurückgibt.

Verwandte Themen