如何处理/拦截 Identity Server 4 .NET Core 引发的事件

Dan*_*Dan 5 asp.net-core-mvc asp.net-core identityserver4

我在 Identity Server 4 文档中读到可以像这样打开事件:

services.AddIdentityServer(options =>
{
    options.Events.RaiseSuccessEvents = true;
    options.Events.RaiseFailureEvents = true;
    options.Events.RaiseErrorEvents = true;
});
Run Code Online (Sandbox Code Playgroud)

这一切都很好,但我想知道如何侦听事件发生时的情况,例如“ApiAuthenticationSuccessEvent”。如何侦听 .NET Core Web 应用程序中引发的此事件?我不会将事件持久保存到某个事件存储中,我只需要知道何时引发此类事件,以便我可以检查该事件并使用该信息执行某些操作。

也许我以错误的方式处理这个问题,或者我错过了一些明显的东西!

Jav*_*rid 8

即使这是一个有点老的问题,我也遇到了同样的问题并通过以下方式解决了。你只需要注册自己的IEventSink实现并实现该方法PersistAsync

public class CustomEventSink : IEventSink
{
    public CustomEventSink()
    {
    }

    public Task PersistAsync(Event evt)
    {
       // Log in the way you want the event
       return Task.CompletedTask;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的Startup.cs中

 // Do this AFTER having added IndentityServer with services.AddIdentityServer
 services.AddTransient<IEventSink, CustomEventSink>();
Run Code Online (Sandbox Code Playgroud)

如果您查看 Github 中的 IdentityServer4 DefaultEventSink 类,就会发现它们将引发的事件记录到已注册的记录器中。


McG*_*V10 2

不幸的是,这些事件严格用于记录目的(并且仅在使用TokenRequestValidatorIS4 内部结构时)。

我最近提出了一个功能请求,要求提供“真实”事件,但他们并不热情。基本上,他们认为这些活动属于客户端(OIDC 流发起或返回的任何地方)。

我可以理解他们的观点,但我真的更愿意将 IS4 日志记录与 IS4 隔离......