Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Web API Custom Filter not firing

I have created a custom Filter Attribute that will be doing some basic token validation. So I started by just adding a few lines to see with it works correctly but for some reason is it not working.

Custom Filter Class

/// <summary>
/// Basic Token Based Authitication 
/// </summary>
public class BasicTokenValidation : ActionFilterAttribute
{
    /// <summary>
    /// Validate Token
    /// </summary>
    /// <param name="actionContext"></param>
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        HttpContext.Current.Response.Write(" filter1 ");
        Debug.WriteLine("Executing My Filter!");
        if (actionContext.Request.Headers.Authorization == null)
        {
            actionContext.Response = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
        }
        else {
            string authToken = actionContext.Request.Headers.Authorization.Parameter;
        }

        base.OnActionExecuting(actionContext);
    }
}

I registered it in WebApi.config

config.Filters.Add(new BasicTokenValidation());

Here is how I decorated my Controller method

[HttpGet]
[Route("get/all")]
[BasicTokenValidation]
public IHttpActionResult GetAll()
{
    try
    {

        // Some Code
    }
    catch (Exception ex)
    {
        return InternalServerError(ex);
    }
}

Not sure if I need to configure something else. Did read a few post and articles and to some I do have everything what I need to create custom filters.

Any assistance would be appreciated.

Thanks

like image 855
Gericke Avatar asked Mar 16 '17 21:03

Gericke


1 Answers

Your action filter is working. Could you ensure that you use WebAPI assembly System.Web.Http.Filters instead of MVC assembly System.Web.Http.Mvc?

using System.Diagnostics;
using System.Web;
using System.Web.Http.Controllers; 
using System.Web.Http.Filters; <--- WebAPI assembly 

namespace YOURNAMESPACE
{
    public class BasicTokenValidation : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            HttpContext.Current.Response.Write(" filter1 ");
            Debug.WriteLine("Executing My Filter!");
            if (actionContext.Request.Headers.Authorization == null)
            {
                actionContext.Response = 
                    new System.Net.Http.HttpResponseMessage(
                         System.Net.HttpStatusCode.Unauthorized);
            }
            else
            {
                string authToken = actionContext.Request.Headers.Authorization.Parameter;
            }

            base.OnActionExecuting(actionContext);
        }
    }
}

Since you register BasicTokenValidation action filter globally, you might want to look at Basic Authentication using DelegatingHandler that I answered in SO.

like image 74
Win Avatar answered Oct 10 '22 04:10

Win