Пользовательская проверка токена JWT в. NET Core 2.2 - PullRequest
0 голосов
/ 21 февраля 2020

Я пытаюсь проверить токен JWT с помощью пользовательской проверки. Токен сгенерирован в другом API, отличном от моего, но у меня есть способ проверить его по службе.

Я в растерянности из-за того, что отсутствует ... Я продолжаю получать 401 код, даже когда моя проверка правильна.

РЕДАКТИРОВАТЬ : Добавлены параметры проверки токена и добавлена ​​точность о проверке токена

Вот мой код:

Запуск .cs

services.AddAuthentication(options =>
            {
               var tokenValidationParameters = new TokenValidationParameters
               {
                   ValidateIssuer = false,
                   ValidateAudience = false,
                   ValidateIssuerSigningKey = false
               };

                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })//.AddCustomAuthenticationBearer();

                .AddJwtBearer(options =>
            {
                options.SecurityTokenValidators.Clear();
                options.SecurityTokenValidators.Add(new CustomJwtSecurityTokenHandler(_configuration));
                options.TokenValidationParameters = tokenValidationParameters;
                options.SaveToken = false;
                options.Events = new JwtBearerEvents
                {
                    OnTokenValidated = context =>
                    {
                        context.Success();
                        return Task.CompletedTask;
                    }
                };
            });

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApiVersionDescriptionProvider provider)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            //else
            //{
            //    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            //    app.UseHsts();
            //}

            //app.UseHttpsRedirection();
            app.UseAuthentication();
            app.UseMvc();

            app.UseSwagger();
            app.UseSwaggerUI(options =>
            {
                foreach (var description in provider.ApiVersionDescriptions)
                {
                    options.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant());
                }
            });
        }

CustomJwtSecurityTokenHandler

public class CustomJwtSecurityTokenHandler : ISecurityTokenValidator
    {
        public bool CanValidateToken => true;
        public int MaximumTokenSizeInBytes { get; set; } = TokenValidationParameters.DefaultMaximumTokenSizeInBytes;

        private readonly JwtSecurityTokenHandler _tokenHandler;
        private readonly string _fcAuthUrl;

        public CustomJwtSecurityTokenHandler(IConfiguration configuration)
        {
            _tokenHandler = new JwtSecurityTokenHandler();
            _fcAuthUrl = configuration["Authentication:BaseUri"];
        }

        public bool CanReadToken(string securityToken)
        {
            return _tokenHandler.CanReadToken(securityToken);
        }

        public ClaimsPrincipal ValidateToken(string securityToken, TokenValidationParameters validationParameters,
            out SecurityToken validatedToken)
        {
            var jwt = _tokenHandler.ReadJwtToken(securityToken);
            var accessToken = jwt.Claims.FirstOrDefault(c => c.Type == "auth_token")?.Value;

            if (accessToken == null)
            {
                validatedToken = null;
                return null;
            }

            var task = IsTokenValid(accessToken);
            task.Wait();
            if (task.Result)
            {
                validatedToken = new JsonWebToken(securityToken);
                return new ClaimsPrincipal();
            }

            validatedToken = null;
            return null;
        }

        private async Task<bool> IsTokenValid(string accessToken)
        {
            // My validation here
            // Simple http call to authentication service to validate token
        }
    }

Вот журналы, которые у меня есть на один вызов:

2020-02-21 16: 12: 58.194 +01: 00 [0HLTMS23C48IQ: 00000001] [] [Microsoft.AspNetCore.Hosting.Internal.WebHost] [Информация] Запрос на запуск HTTP / 1.1 GET https://localhost: 5001 / api / уведомления / переводы

2020-02-21 16: 12: 58.458 +01: 00 [0HLTMS23C48IQ: 00000001] [] [Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler] [Информация] Успешно подтвердил токен.

2020-02-21 16: 12: 58.485 +01: 00 [0HLTMS23C48IQ: 00000001] [] [Microsoft.AspNetCore.Routing. EndpointMiddleware] [Информация] Выполнение конечной точки "NotificationCenter.Api.Controllers.TranslationController.GetStandardTranslations (NotificationCenter.API)" '

2020-02-21 16: 12: 58.522 +01: 00 [0HLTMS23C48IQ: 00000001] [] [Microsoft.AspNetCore. Mvc .Internal.ControllerActionInvoker] [Информация] Маршрут соответствует "{action = \" GetStandardTranslations \ ", controller = \" Translation \ "}". Выполнение действия контроллера с подписью «System.Threading.Tasks.Task`1 [NotificationCenter.BusinessLogi c .DTOs.Responses.TranslationsResponseDTO] GetStandardTranslations ()» на контроллере «NotificationCenter.Api.Controllers.TranslationController» («NotificationCenter»). ).

2020-02-21 16: 12: 58.538 +01: 00 [0HLTMS23C48IQ: 00000001] [] [Microsoft.AspNetCore.Authorization.DefaultAuthorizationService] [Информация] Ошибка авторизации.

2020-02-21 16: 12: 58.540 +01: 00 [0HLTMS23C48IQ: 00000001] [] [Microsoft.AspNetCore. Mvc .Internal.ControllerActionInvoker] [Информация] Ошибка авторизации для запроса в фильтре '"Microsoft.AspNetCore. Mvc .Authorization.AuthorizeFilter "'.

2020-02-21 16: 12: 58.547 +01: 00 [0HLTMS23C48IQ: 00000001] [] [Microsoft.AspNetCore. Mvc .ChallengeResult] [Информация ] Выполнение ChallengeResult со схемами аутентификации ([]).

2020-02-21 16: 12: 58.557 +01: 00 [0HLTMS23C48IQ: 00000001] [] [Microsoft.AspNetCore.Authen tication.JwtBearer.JwtBearerHandler] [Информация] Схема аутентификации: «Носитель» был вызван.

2020-02-21 16: 12: 58.562 +01: 00 [0HLTMS23C48IQ: 00000001] [] [Microsoft.AspNetCore. Mvc .Internal.ControllerActionInvoker] [Информация] Выполнено действие «NotificationCenter.Api.Controllers.TranslationController.GetStandardTranslations (NotificationCenter.API)» в 32.8311ms

2020-02-21 16: 12: 58.585 +01: 00 [0HLTMS23C48IQ: 00000001] [] [Microsoft.AspNetCore.Routing.EndpointMiddleware] [Информация] Выполненная конечная точка 21 16: 12: 58.628 +01: 00 [0HLTMS23C48IQ: 00000001] [] [Microsoft.AspNetCore.Hosting.Internal.WebHost] [Информация] Запрос завершен за 433,6413 мс 401

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