void IPostConfigureOptions <JwtBearerOptions> .PostConfigure(string name, JwtBearerOptions options) { options.Events = new JwtBearerEvents() { OnMessageReceived = (MessageReceivedContext context) => { if (context.Request.Headers.ContainsKey(JwtTokenHeaderName)) { context.Token = context.Request.Headers[JwtTokenHeaderName]; } return(Task.CompletedTask); }, OnTokenValidated = (TokenValidatedContext context) => { var userInfo = context.HttpContext.RequestServices.GetRequiredService <IUserInfo>(); userInfo.Bind(context.HttpContext, context.Principal); return(Task.CompletedTask); }, OnChallenge = (JwtBearerChallengeContext context) => { if (context.Request.Headers.ContainsKey(JwtTokenHeaderName)) { var token = context.Request.Headers[JwtTokenHeaderName]; var logger = context.HttpContext.RequestServices.GetRequiredService <ILogger <CustomJwtBearerOptions> >(); logger.LogWarning($"JWT Authentication failed with token: {token}. {context.Request.Method} {context.Request.Path}. {context.AuthenticateFailure.Message}"); } return(Task.CompletedTask); }, }; options.RequireHttpsMetadata = false; options.SaveToken = true; options.TokenValidationParameters = new TokenValidationParameters { AuthenticationType = JwtBearerDefaults.AuthenticationScheme, ValidateIssuer = false, ValidateAudience = false, ValidateLifetime = true, ClockSkew = TimeSpan.Zero, IssuerSigningKeyResolver = (string token, SecurityToken securityToken, string kid, TokenValidationParameters validationParameters) => { return(new SecurityKey[] { _credentialProvider.GetSigningKey() }); } }; }