ActionFilter не называется WebAPI / .netCore - PullRequest
0 голосов
/ 05 июня 2018

У меня есть приложение webAPI, написанное на .NETCore, и все, что я хочу, - это перехватить запрос с помощью фильтра действий, а затем проверить токен JWT в заголовке from.Я написал ActionFilter, который выглядит следующим образом:

using Microsoft.AspNetCore.Mvc.Filters;
using Newtonsoft.Json;

namespace Applciation.ActionFilters
{
    public class AuthorizeJWT: ActionFilterAttribute, IActionFilter
    {
        void IActionFilter.OnActionExecuting(ActionExecutingContext context)
        {
            var jwt = context.HttpContext.Request.Headers["JWT"];

            try
            {
                var json = new JwtBuilder()
                    .WithSecret(File.ReadLines("").ToList().First())
                    .MustVerifySignature()
                    .Decode(jwt);                    

                var tokenDetails = JsonConvert.DeserializeObject<dynamic>(json);
            }
            catch (TokenExpiredException)
            {
                throw new Exception("Token is expired");
            }
            catch (SignatureVerificationException)
            {
                throw new Exception("Token signature invalid");
            }
            catch(Exception ex)
            {
              throw new Exception("Token has been tempered with");
            }
        }
    }
}

Теперь я добавил фильтр действий в конфигурации служб, как показано ниже:

services.AddScoped<AuthorizeJWT>();

и украсил свойконтроллер, как показано ниже:

 [AuthorizeJWT]            
    public virtual async Task<IActionResult> Ceate([FromBody]CreateDto,createDto)
{
   //method body
}

Но по какой-то причине мой фильтр действий просто не вызывается.Что-то, чего мне не хватает в конфигурации?

1 Ответ

0 голосов
/ 05 июня 2018

Определение вашего ActionFilter неверно.Вам нужно только наследовать от класса ActionFilterAttribute, а не от интерфейса IActionFilter, поскольку класс ActionFilterAttribute уже реализует этот интерфейс.

Если вы удалите интерфейс из наследования, а затем измените определение метода OnActionExecutingчтобы переопределить реализацию базового класса, тогда все будет работать как положено:

using Microsoft.AspNetCore.Mvc.Filters;
using Newtonsoft.Json;

namespace Applciation.ActionFilters
{
    public class AuthorizeJWT: ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            var jwt = context.HttpContext.Request.Headers["JWT"];

            try
            {
                var json = new JwtBuilder()
                    .WithSecret(File.ReadLines("").ToList().First())
                    .MustVerifySignature()
                    .Decode(jwt);                    

                var tokenDetails = JsonConvert.DeserializeObject<dynamic>(json);
            }
            catch (TokenExpiredException)
            {
                throw new Exception("Token is expired");
            }
            catch (SignatureVerificationException)
            {
                throw new Exception("Token signature invalid");
            }
            catch(Exception ex)
            {
              throw new Exception("Token has been tempered with");
            }
        }
    }
}
...