ASP.NET MVC Custom Action Filters

less than 1 minute read

We need to log all user activities for enhanced security monitoring. in ASP.NET core, I would be using a custom middleware. A similar thing for MVC is Action Filter. By adding a custom Action Filter to the global Filter collection, I would be able to log all request related information.

Btw, here Filter means the filter in pipeline and filter design pattern.

Create a filter

public class RequestLoggingFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        System.Diagnostics.Trace.TraceInformation($"Url: {filterContext.HttpContext.Request.Url}");
        System.Diagnostics.Trace.TraceInformation($"UserAgent: {filterContext.HttpContext.Request.UserAgent}");
        System.Diagnostics.Trace.TraceInformation($"Client IP Address: {filterContext.HttpContext.Request.UserHostAddress}");

        var user = filterContext.HttpContext.User as MvcPrincipal;
        if (user == null)
            return;

        System.Diagnostics.Trace.TraceInformation($"Authenticationid: {user.AuthenticationId}");
        System.Diagnostics.Trace.TraceInformation($"CollectiveApprovalId: {user.CollectiveApprovalUserId}");
        System.Diagnostics.Trace.TraceInformation($"InstitutionId: {user.InstitutionId}");
        System.Diagnostics.Trace.TraceInformation($"Organisation: {user.Organisation}");
        System.Diagnostics.Trace.TraceInformation($"PrincipalId: {user.PrincipalId}");
        System.Diagnostics.Trace.TraceInformation($"User Name: {user.DisplayName}");
        System.Diagnostics.Trace.TraceInformation($"User Email: {user.Email}");

        System.Diagnostics.Trace.TraceInformation($"User Roles: {string.Join(", ", user.PrincipalClaims)}");
    }

    public void OnActionExecuted(ActionExecutedContext filterContext) { }
}

Register the filter to the Global Filter collection

Once you have your custom Filter, you need to register it, so that the pipeline execute your fiter.

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        ....
        filters.Add(new RequestLoggingFilter());
    }
}


public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        ....

        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    }

Categories:

Updated:

Comments