在不使用try / catch的情况下验证.NET Core中的JSON Web令牌

时间:2019-07-03 18:34:09

标签: c# .net .net-core jwt

我目前正在尝试按照以下answer

中建议的方式来验证JWT

代码示例

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

没有try / catch子句,有没有更好的方法来实现这样的目标?在我看来,这似乎是一个很麻烦的解决方案,尤其是在将此功能连接到控制器时。

谢谢!

1 个答案:

答案 0 :(得分:1)

关于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] ..您可以添加自己的事件处理程序方法,如果/在每个事件发生时它们将触发。