如何在使用OWIN和JWT时记录身份验证失败的原因



我使用的是一个c#自托管的OWIN服务器,并已将我的应用程序配置为使用JWT授权,如下所示。这可以正常工作,无效令牌将被401拒绝。未经授权的有效令牌将被接受。

我的问题是如何写为什么请求被拒绝的日志。它过期了吗?观众错了吗?没有代币吗?我希望所有失败的请求都被记录下来,但我似乎找不到任何如何记录的例子。

public class Startup
    {
        public void Configuration(IAppBuilder appBuilder)
        {
            // Configure Web API for self-host. 
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
            // Enable 
            config.Filters.Add(new AuthorizeAttribute());
            appBuilder.UseJwtBearerAuthentication(new JwtOptions());
            appBuilder.UseWebApi(config);
        }
    }

JwtOptions.cs

public class JwtOptions : JwtBearerAuthenticationOptions
    {
        public JwtOptions()
        {
            var issuer = WebConfigurationManager.AppSettings["CertificateIssuer"];
            var audience = WebConfigurationManager.AppSettings["CertificateAudience"];
            var x590Certificate = Ap21X509Certificate.Get(WebConfigurationManager.AppSettings["CertificateThumbprint"]);
            AllowedAudiences = new[] { audience };
            IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
            {
                new X509CertificateSecurityTokenProvider(issuer, new X509Certificate2(x590Certificate.RawData))
            };
        }
    }

我想我需要实现我自己的验证才能做到这一点,但也不确定如何实现。

我知道已经很晚了,但对于那些正在努力寻找答案的人来说,这可能很有用。

AuthenticationMiddleware基本上具有嵌入式日志记录功能。您只需要将OWIN日志重定向到您正在使用的记录器。NLog.Owin.Logging对我来说效果很好。log4net也有类似的解决方案。

还有其他解决方案。扩展JwtSecurityTokenHandler并手动记录原因。

public class LoggingJwtSecurityTokenHandler : JwtSecurityTokenHandler
{
    public override ClaimsPrincipal ValidateToken(string securityToken, TokenValidationParameters validationParameters, out SecurityToken validatedToken)
    {
        try
        {
            return base.ValidateToken(securityToken, validationParameters, out validatedToken);
        }
        catch (Exception ex)
        {
            //log the error
            throw;
        }
    }
}

并像这样使用:

app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
{
    TokenHandler = new LoggingJwtSecurityTokenHandler()
});

最新更新