使用 OWIN 和 JWT 时如何记录身份验证失败的原因?
How to log authentication failure reasons when using OWIN and JWT?
我正在使用 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))
};
}
}
我猜我需要实施自己的验证才能执行此操作,但也不确定如何实施。
我知道现在已经很晚了,但对于正在努力寻找答案的人可能会有用。
基本上 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()
});
我正在使用 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))
};
}
}
我猜我需要实施自己的验证才能执行此操作,但也不确定如何实施。
我知道现在已经很晚了,但对于正在努力寻找答案的人可能会有用。
基本上 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()
});