nbarbettini / BeautifulRestApi

Beautiful REST API design with ASP.NET Core and Ion
Apache License 2.0
605 stars 145 forks source link

JsonExceptionMiddleware in ASP.NET Core 3 #17

Open rochapablo opened 4 years ago

rochapablo commented 4 years ago

I'm trying to follow the example, but it seems that app.UseExceptionHandler it's called only when I remove app.UseAuthorization, but I do need UseAuthorization. What could I be missing?

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // Serialize all exceptions to JSON
    var jsonExceptionMiddleware = new JsonExceptionMiddleware(app.ApplicationServices.GetRequiredService<Microsoft.AspNetCore.Hosting.IHostingEnvironment>());
    app.UseExceptionHandler(new ExceptionHandlerOptions { ExceptionHandler = jsonExceptionMiddleware.Invoke });

    app.UseHsts();

    app.UseRouting();

    app.UseHttpsRedirection();            

    app.UseCors(x => x
        .AllowAnyOrigin()
        .AllowAnyMethod()
        .AllowAnyHeader());            

    app.UseAuthentication();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });            

    app.UseResponseCaching();
}

When I have status 401 for example, It should be calling JsonExceptionMiddleware.Invoke before the request response, but the body it's empty.

nbarbettini commented 4 years ago

401 (authorization failure) isn't the same thing as an unhandled exception. UseExceptionHandler is only invoked when an exception is thrown by some code in your application. Authorization failures don't throw exceptions, though.

Are you trying to customize the payload that's returned along with 401?