如何在 .net 核心中记录授权尝试

Posted

技术标签:

【中文标题】如何在 .net 核心中记录授权尝试【英文标题】:How do I log authorization attempts in .net core 【发布时间】:2018-07-31 01:57:20 【问题描述】:

当我尝试访问授权属性下的方法时,我正在尝试写入日志。基本上,我想记录一个人是否使用了无效令牌或过期令牌。我正在使用 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))
        ;

    );

有没有一种方法可以将一段代码添加到授权检查中,以记录授权尝试是否有效以及为什么无效?

【问题讨论】:

好的,我澄清了这个问题。感谢您的提醒。 你可以继承AuthorizeAttribute,做你的日志并调用base方法 我应该调用哪种方法。据我所知,AuthorizeAttribute 只有两个构造函数,但没有实际方法。 【参考方案1】:

您可以访问 JwtBearerEvents 对象,该对象定义了在处理不记名令牌时引发的许多事件。

验证失败 如果在请求处理期间抛出异常,则调用。除非被抑制,否则将在此事件之后重新抛出异常。

挑战 在将质询发送回调用方之前调用。

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

【讨论】:

我确实看到了。但是有没有办法我可以看到身份验证失败的原因?例如,令牌是无效的,还是过期了? 我认为身份验证和授权之间可能存在混淆。 JwtBearerEvents 处理身份验证,但问题是关于授权。 他们提到“基本上,如果有人使用无效令牌或过期令牌,我想记录。”,所以这是在 AuthN 阶段。根据消息来源github.com/aspnet/Security/blob/…,无效令牌触发 OnAuthenticationFailed 处理程序 如果你没有做任何异步操作,你需要return Task.CompletedTask; github.com/aspnet/Security/issues/1680 @MichaelKargl 你知道如何拦截授权请求并记录任何错误吗?

以上是关于如何在 .net 核心中记录授权尝试的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.net 核心集成测试中获得授权(我非常接近)

如何使用自定义策略模式实现 jwt 令牌基础身份验证以在 .net 核心中进行授权?

尝试在 .net 核心中授权 ClaimsIdentity

如何实现身份验证和授权 WEB API 2 .NET 应用程序?尝试 JWT 库

如何使用 ActiveMerchant 在 authorize.net 网关中取消授权交易

微服务如何在异步通信中做授权?