我目前正在尝试按照以下answer
中建议的方式来验证JWT代码示例
try
{
tokenHandler.ValidateToken(token, validationParameters, out validatedToken);
}
catch (Exception e)
{
log(e.ToString()); //something else happened
throw;
}
没有try / catch子句,有没有更好的方法来实现这样的目标?在我看来,这似乎是一个很麻烦的解决方案,尤其是在将此功能连接到控制器时。
谢谢!
答案 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] ..您可以添加自己的事件处理程序方法,如果/在每个事件发生时它们将触发。