簡體   English   中英

如何在 .net 核心中記錄授權嘗試

[英]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 后調用。

https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.authentication.jwtbearer.jwtbearerevents?view=aspnetcore-2.0

在 AddJwtBearer 初始化配置時,添加您要訂閱的事件,

.AddJwtBearer(o =>
{
    o.Events = new JwtBearerEvents()
    {
        OnAuthenticationFailed = c =>
        {
            // do some logging or whatever...
        }

    };
});

查看源代碼以了解何時可能引發事件,

https://github.com/aspnet/Security/blob/dev/src/Microsoft.AspNetCore.Authentication.JwtBearer/JwtBearerHandler.cs

不確定它是否已經在早期版本的 .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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM