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

时间:2018-02-21 18:55:05

标签: asp.net-core asp.net-core-mvc identityserver4

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

services.AddIdentityServer(options =>
{
    options.Events.RaiseSuccessEvents = true;
    options.Events.RaiseFailureEvents = true;
    options.Events.RaiseErrorEvents = true;
});

这一切都很好,但我想知道如何在引发事件时监听,例如“ApiAuthenticationSuccessEvent'”。如何在.NET Core Web应用程序中监听此事件?我不会在某个地方将事件持续到某个事件存储区,我只需要知道何时引发这样的事件,以便我可以检查事件并对信息做些什么。

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

2 个答案:

答案 0 :(得分:0)

不幸的是,这些事件严格用于记录目的(并且仅在使用TokenRequestValidator时,就IS4内部而言)。

我最近开了一个feature request询问“真实”事件,但他们并不热情。基本上他们认为这些活动属于客户端(OIDC流程发起或返回的任何地方)。

我可以看到他们的观点,但我真的更愿意将IS4记录保持隔离到IS4 ......

答案 1 :(得分:0)

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

public class CustomEventSink : IEventSink
{

    public CustomEventSink()
    {
    }

    public Task PersistAsync(Event evt)
    {
        // log in the way you want the evt
       return Task.CompletedTask;
    }
}

然后在您的 Startup.cs

 // do this AFTER having added IndentityServer with services.AddIdentityServer
 services.AddTransient<IEventSink, CustomEventSink>();

如果您查看IdentityServer4 Github项目,那么它们会将引发的事件记录到已注册的记录器中:https://github.com/IdentityServer/IdentityServer4/blob/master/src/IdentityServer4/src/Services/Default/DefaultEventSink.cs