Проверьте JSON Web Token в .NET Core без использования try / catch - PullRequest
0 голосов
/ 03 июля 2019

В настоящее время я пытаюсь проверить JWT так, как это было предложено в следующем ответе

Вот пример кода

try 
{
 tokenHandler.ValidateToken(token, validationParameters, out validatedToken);
} 
catch (Exception e) 
{
 log(e.ToString()); //something else happened
 throw;
}

Есть лилучший способ добиться чего-то подобного без предложения try / catch?Мне кажется, это довольно грязное решение, особенно при подключении этой функции к контроллеру.

Спасибо!

1 Ответ

1 голос
/ 03 июля 2019

Замечательная вещь в Net Core состоит в том, что он встроен. На самом деле вам не нужно проверять токены самостоятельно.Если токен недействителен, ответ автоматически отправляется обратно клиенту.Однако, если вы чувствуете необходимость погрузиться и проверить вручную - вы можете сделать это: https://www.jerriepelser.com/blog/manually-validating-rs256-jwt-dotnet/

Хорошо, так что я выкопал некоторый код из недр одного из моих проектов ... В основномэто позволяет мне подключаться к событиям, которые происходят при проверке токена, и назначать свои собственные четные обработчики различным точкам.

Я считаю, что это то, что вы ищете.

Добавьте этот код вваши регистрации IServiceCollection:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddCustomJwtBearer(options =>
        {
            options.TokenValidationParameters = tokenParams;
            options.Events = ConfigureJwtEvents(tokenConfiguration);
        });

И этот код где-то в STATIC-классе, так что вы можете вызывать его как метод расширения:

public static void AddCustomJwtBearer(this AuthenticationBuilder builder, Action<JwtBearerOptions> options)
    {
        builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IPostConfigureOptions<JwtBearerOptions>, JwtBearerPostConfigureOptions>());
        builder.AddScheme<JwtBearerOptions, JwtBearerHandler>("Bearer", null, options);
    }


/// <summary>
/// Returns a configured <see cref="JwtBearerEvents"/>
/// </summary>
/// <param name="tokenConfiguration">Token Configuration</param>
/// <returns><see cref="JwtBearerEvents"/></returns>
private static JwtBearerEvents ConfigureJwtEvents(TokenConfiguration tokenConfiguration)
{
    var bearerEvents = new JwtBearerEvents
    {
        OnAuthenticationFailed = context =>
        {
            if (context.Exception.GetType() == typeof(SecurityTokenExpiredException))
            {
                context.Response.Headers.Add("Token-Expired", "true");
            }

         return Task.CompletedTask;
        }
    };

    // Authentication Failed Method
    bearerEvents.OnAuthenticationFailed = [YOUR-EVENT-HANDLER]

    // Challenge Raised Event
    bearerEvents.OnChallenge = [YOUR-EVENT-HANDLER]

    // Message Received Event
    bearerEvents.OnMessageReceived = [YOUR-EVENT-HANDLER]

    // Token Validated Event
    bearerEvents.OnTokenValidated = [YOUR-EVENT-HANDLER]

    return bearerEvents;
}

Где он говорит: [YOUR-EVENT-HANDLER] .. Вы можете добавить свои собственные методы обработчика событий, и они будут срабатывать, если / когда произойдет каждое из этих событий.

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