Audit.NET e Asp Net Core Razor Pages

Sep 02 2020

Sto usando pagine Razor nella mia applicazione ASP.NET Core. Devo abilitare la registrazione con la libreria Audit.NET , funziona bene con i controller ASP.NET MVC, ma non funziona con le pagine Razor.

Ecco un esempio di come dichiaro una PageModelclasse con Auditattributo:

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

Viene generato NullReferenceExceptionquando AuditAttributeviene richiamato il filtro di azione.

Ecco il metodo dichiarato in AuditAttribute:
(A quanto ho capito actionDescriptornon è possibile eseguire il cast del parametro 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>();
}

Allora cosa posso fare in questo caso? Qualcuno ha riscontrato un problema simile?

Risposte

thepirat000 Sep 03 2020 at 10:48

Il meccanismo di controllo per MVC è stato implementato con un filtro di azione, ma i filtri di azione non sono supportati in Razor Pages .

Per le pagine Razor, viene invece fornito un filtro pagina , in modo da poter configurare il controllo.

Utilizza AuditPageFilterl' [Audit]attributo fornito anziché l' attributo.

Fondamentalmente devi solo aggiungere il filtro alla raccolta sulla tua logica di avvio, ad esempio:

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

Controlla il file readme qui .