如何在 .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 核心中进行授权?
如何实现身份验证和授权 WEB API 2 .NET 应用程序?尝试 JWT 库