Modelo de resposta 401 e 403 personalizado com o middleware UseJwtBearerAuthentication

Quero responder com um modelo de resposta JSON quando ocorrerem 401 e 403. Por exemplo:

HTTP 401
{
  "message": "Authentication failed. The request must include a valid and non-expired bearer token in the Authorization header."
}

Estou usando o middleware (como sugerido emesta resposta) para interceptar 404s e funciona muito bem, mas não é o caso dos 401 ou 403s. Aqui está o middleware:

app.Use(async (context, next) =>
{
    await next();
    if (context.Response.StatusCode == 401)
    {
        context.Response.ContentType = "application/json";
        await context.Response.WriteAsync(JsonConvert.SerializeObject(UnauthorizedModel.Create(), SerializerSettings), Encoding.UTF8);
    }
});

Quando colocado ABAIXOapp.UseJwtBearerAuthentication(..) noStartup.Configure(..), parece ser completamente ignorado e um 401 normal é retornado.

Quando colocado ACIMAapp.UseJwtBearerAuthentication(..) noStartup.Configure(..), a seguinte exceção é lançada:

ID de conexão "0HKT7SUBPLHEM": Uma exceção não tratada foi lançada pelo aplicativo. System.InvalidOperationException: os cabeçalhos são somente leitura, a resposta já foi iniciada. em Microsoft.AspNetCore.Server.Kestrel.Internal.Http.FrameHeaders.Microsoft.AspNetCore.Http.IHeaderDictionary.set_Item (chave de cadeia, valor StringValues) em Microsoft.AspNetCore.Http.Internal.DefaultHttpResponse.set_ContentType (String value) em String. Api.Startup. <b__12_0> d.MoveNext () em Startup.cs

questionAnswers(2)

yourAnswerToTheQuestion