【问题标题】:How to log authentication failure reasons when using OWIN and JWT?使用 OWIN 和 JWT 时如何记录身份验证失败的原因?
【发布时间】:2016-02-08 06:59:08
【问题描述】:

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

我的问题是我怎样才能写一个为什么请求被拒绝的日志。是不是过期了?是不是观众错了?没有令牌存在吗?我希望记录所有失败的请求,但我似乎找不到任何示例。

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))
            };
        }
    }

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

【问题讨论】:

  • 对此有任何答案吗?我想知道同样的事情......
  • 暂时没有答案,好像没有人知道。

标签: c# owin jwt


【解决方案1】:

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

基本上 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()
});

【讨论】:

    猜你喜欢
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 2020-10-30
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 2020-07-24
    相关资源
    最近更新 更多