IdentityServer 4 客户端的身份验证事件

3

我已经配置了一个IdentityServer 4服务器作为一个独立的应用程序,使用net core 3.1、Entity Framework core(针对 MySql)和Net Core Identity作为用户存储。另外还有一个Razor Pages客户端应用程序,它通过身份验证服务器进行身份验证,并在服务器上进行用户登录。所有这些都正常工作。

现在我希望能够为任何新用户身份验证或登录失败在客户端写入日志条目。我假设必须有某个事件被触发。请问我该如何操作?


你为什么想在客户端而不是认证服务器上记录日志呢?IdentityServer 有相应的 事件 可以处理。如果登录失败并不会返回给客户端,因为它并没有发生在客户端,除非你将其捕获并以某种方式发送给客户端。 - hyperdrive
是的,主要是为了审计目的。显然可以并排阅读日志,但这样不太方便和有效。 - David
只是一些想法,您可以在 Razor 客户端上添加一个端点,并将身份验证服务器上的事件发布到 Razor 客户端。或者,您可以向客户端添加中间件,检查请求是否附加了 ReturnUrl 或身份验证服务器引用程序的某些参数。 - hyperdrive
我认为唯一可靠的是服务器到客户端的通信;从一个发送事件到另一个。这样,您就不会因为某人返回或其他原因而收到重复的事件。 - hyperdrive
1个回答

1

我有同样的需求,例如将身份验证失败存储在审计日志中 - 如果有人尝试使用无效令牌访问API。

我发现IdentityServerAuthenticationOptions具有JwtBearerEvents属性,可以用于通知此类事件。

在我的情况下,它是这样工作的:

.AddAuthentication(AUTH_SCHEME).AddIdentityServerAuthentication(AUTH_SCHEME, options => {
    options.ApiName = config.ApiName;
    options.Authority = config.Address;
    options.JwtBearerEvents = new JwtBearerEvents
    {
        OnAuthenticationFailed = c =>
        {
            // Log can bo done here
            return Task.CompletedTask;
        },
        OnTokenValidated = c =>
        {
            // Log can bo done here
            return Task.CompletedTask;
        },
        OnChallenge = c =>
        {
            // Log can bo done here
            return Task.CompletedTask;
        },
        OnForbidden = c =>
        {
            // Log can bo done here
            return Task.CompletedTask;
        }
    };
    options.SupportedTokens = SupportedTokens.Jwt;});

我曾担心它会覆盖正常的IS行为,但现在看起来一切都像以前一样工作。

你可以在那里访问适当的上下文,例如在 JwtBearerChallengeContext 中,你可以读取 ErrorErrorDescription 字符串甚至整个 HttpContext


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接