Как получить доступ к объекту из фильтра действий в действии контроллера в ядре .net? - PullRequest
0 голосов
/ 30 августа 2018

В веб-интерфейсе API, который я создаю, есть некоторые контроллеры, у которых есть действия, которые получают jwttoken от React в качестве параметра, пример этого показан ниже.

public async Task<IActionResult> post(string token)
        {
            if (!string.IsNullOrEmpty(token))
            {
                IJsonSerializer serializer = new JsonNetSerializer();
                IDateTimeProvider provider = new UtcDateTimeProvider();
                IJwtValidator validator = new JwtValidator(serializer, provider);
                IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
                IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder);

                var jsonDecoded = decoder.Decode(token);
                var jwtObject = JsonConvert.DeserializeObject<JwtToken>(jsonDecoded);
//do some business logic
}

Многие методы имеют один и тот же код, дублирующийся для проверки токена путем его расшифровки, а затем продолжения со своей ответственностью.

Я создал фильтр аутентификации

public class AuthenticateFilter : Attribute,IActionFilter
    {
        public void OnActionExecuted(ActionExecutedContext context)
        {
            throw new NotImplementedException();
        }

        public void OnActionExecuting(ActionExecutingContext context)
        {
            IJsonSerializer serializer = new JsonNetSerializer();
            IDateTimeProvider provider = new UtcDateTimeProvider();
            IJwtValidator validator = new JwtValidator(serializer, provider);
            IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
            IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder);

            var token = context.HttpContext.Request.QueryString.HasValue ? context.HttpContext.Request.QueryString.Value.Substring(7):String.Empty;
            var jsonDecoded = decoder.Decode(token);
            var jwtObject = JsonConvert.DeserializeObject<JwtToken>(jsonDecoded);
        }
    }

Я зарегистрировал этот фильтр в startup.cs

services.AddMvc(
                options =>
                {
                    options.Filters.Add(new AuthenticateFilter());
                    options.Filters.Add(typeof(AuthenticateFilter));
                }

                ).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

Я использую библиотеку для декодирования токена. https://github.com/jwt-dotnet/jwt

после декодирования токена в фильтре я десериализую строку json в класс .net, который показан ниже.

public class JwtToken
    {
        [JsonProperty("sub")]
        public Guid Sub { get; set; }

        [JsonProperty("aud")]
        public string Aud { get; set; }
}

как я могу получить доступ к объекту

 var jwtObject = JsonConvert.DeserializeObject<JwtToken>(jsonDecoded);

во всех действиях контроллера, где я украшаю атрибут.

На заметку Есть ли лучший способ решить эту проблему, предложения приветствуются.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Я нашел обходной путь для этого, который добавляет объект в словарь

context.HttpContext.Items.Add("jwt", jwtObject);

, который может быть доступен в контроллере через

this.HttpContext.Items.ContainsKey("jwt")
0 голосов
/ 30 августа 2018

Я думаю, что у вас все хорошо, но я не понимаю, зачем вам нужен доступ к объекту.

Если я прав, вы должны поймать исключение, чтобы решить, должно ли быть выполнено действие.

public void OnActionExecuting(ActionExecutingContext context)
    {
        try
        {
            IJsonSerializer serializer = new JsonNetSerializer();
            IDateTimeProvider provider = new UtcDateTimeProvider();
            IJwtValidator validator = new JwtValidator(serializer, provider);
            IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
            IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder);

            var token = context.HttpContext.Request.QueryString.HasValue ? context.HttpContext.Request.QueryString.Value.Substring(7) : String.Empty;
            var jsonDecoded = decoder.Decode(token);
            var jwtObject = JsonConvert.DeserializeObject<JwtToken>(jsonDecoded);
        }
        catch (TokenExpiredException)
        {
            Console.WriteLine("Token has expired");
            //Do something here
        }
        catch (SignatureVerificationException)
        {
            Console.WriteLine("Token has invalid signature");
            //Do something here
        }
    }

Я надеюсь помочь вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...