[英]How do I log authorization attempts in .net core
當我嘗試訪問授權屬性下的方法時,我正在嘗試寫入日志。 基本上,我想記錄一個人是否使用了無效令牌或過期令牌。 我正在使用 JWT 的基本身份驗證
services.AddAuthentication(o =>
{
o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(cfg =>
{
cfg.RequireHttpsMetadata = false;
cfg.SaveToken = true;
cfg.TokenValidationParameters = new TokenValidationParameters()
{
ValidAudience = jwtAudience,
ValidIssuer = jwtIssuer,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSecurityKey))
};
});
有沒有一種方法可以將一段代碼添加到授權檢查中,以記錄授權嘗試是否有效以及為什么無效?
您可以訪問 JwtBearerEvents 對象,該對象定義了在處理不記名令牌時引發的許多事件。
驗證失敗
如果在請求處理期間拋出異常,則調用。 除非被抑制,否則在此事件之后將重新拋出異常。
OnChallenge 在將質詢發送回調用方之前調用。
OnMessageReceived
在第一次收到協議消息時調用。
OnTokenValidated
在安全令牌通過驗證並生成 ClaimsIdentity 后調用。
在 AddJwtBearer 初始化配置時,添加您要訂閱的事件,
.AddJwtBearer(o =>
{
o.Events = new JwtBearerEvents()
{
OnAuthenticationFailed = c =>
{
// do some logging or whatever...
}
};
});
查看源代碼以了解何時可能引發事件,
不確定它是否已經在早期版本的 .NET (Core) 中實現,但我使用的是 .NET 6,我可以通過將日志級別設置為 Microsoft.AspNetCore 的Information
來激活在 .NET 6 中實現的日志記錄Microsoft.AspNetCore.Authentication
類別。
例如在您的appsettings.json
中:
"Logging": {
"LogLevel": {
// ...
"Microsoft.AspNetCore.Authentication": "Information"
}
}
這給了我一個過期令牌的以下日志(我正在使用帶有模板的 log4net):
INFO [Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler] - MESSAGE: Failed to validate the token.
Microsoft.IdentityModel.Tokens.SecurityTokenExpiredException: IDX10223: Lifetime validation failed. The token is expired. ValidTo: 'System.DateTime', Current time: 'System.DateTime'.
at Microsoft.IdentityModel.Tokens.Validators.ValidateLifetime(Nullable`1 notBefore, Nullable`1 expires, SecurityToken securityToken, TokenValidationParameters validationParameters)
at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateLifetime(Nullable`1 notBefore, Nullable`1 expires, JwtSecurityToken jwtToken, TokenValidationParameters validationParameters)
at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateTokenPayload(JwtSecurityToken jwtToken, TokenValidationParameters validationParameters)
at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken(String token, TokenValidationParameters validationParameters, SecurityToken& validatedToken)
at Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync()
當然,如果您想限制更多,您可以在appsettings.json
中使用Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler
類別。 將此類的日志級別設置為Information
非常重要,因為生成的 .NET 6 日志具有此日志級別。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.