Я пытаюсь проверить токен 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