Audit.NET e Asp Net Core Razor Pages

Sep 02 2020

Estou usando páginas de navalha em meu aplicativo ASP.NET Core. Preciso habilitar o log com a biblioteca Audit.NET , funciona bem com controladores ASP.NET MVC, mas não funciona com páginas Razor.

Aqui está um exemplo de como declaro uma PageModelclasse com Auditatributo:

[Audit(EventTypeName = "{area}/{Page} ({verb})",
   IncludeResponseBody = true,
   IncludeRequestBody = true,
   IncludeHeaders = true,
   IncludeModel = true)]
public class LoginIndexModel : PageModel
{
  ...
}

Ele é acionado NullReferenceExceptionquando o AuditAttributefiltro de ação é invocado.

Aqui está o método declarado em AuditAttribute:
(Pelo que entendi o actionDescriptorparâmetro não pode ser convertido para ControllerActionDescriptor)

private bool IsActionIgnored(ActionDescriptor actionDescriptor)
{
    if (actionDescriptor == null)
        return false;

    return ((IEnumerable<object>)(actionDescriptor as ControllerActionDescriptor).ControllerTypeInfo
               .GetCustomAttributes(typeof(AuditIgnoreAttribute), true)).Any<object>() || 
           ((IEnumerable<object>)(actionDescriptor as ControllerActionDescriptor).MethodInfo
               .GetCustomAttributes(typeof(AuditIgnoreAttribute), true)).Any<object>();
}

Então, o que posso fazer neste caso? Alguém encontrou um problema semelhante?

Respostas

thepirat000 Sep 03 2020 at 10:48

O mecanismo de auditoria para MVC foi implementado com um filtro de ação, mas os filtros de ação não são suportados nas Páginas do Razor .

Para páginas do razor, um Filtro de página é fornecido em vez disso, para que você possa configurar a auditoria.

Use o fornecido em AuditPageFiltervez do [Audit]atributo.

Basicamente, você só precisa adicionar o filtro à coleção em sua lógica de inicialização, por exemplo:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages()
        .AddMvcOptions(options =>
        {
            options.Filters.Add(new Audit.Mvc.AuditPageFilter()
            {
                IncludeHeaders = true, ...
            });
        });
}

Verifique o leia-me aqui .