成功授权后如何执行自定义代码?

时间:2018-02-14 12:03:26

标签: identityserver4

客户端应用程序正在重定向到IdentityServer4实例 - " / connect / authorize / callback"?client_id = ..."。 如果用户未登录(没有cookie),则会将其重定向到“登录”页面,并且在回发时我可以执行随机逻辑(将用户订阅到此客户端 - 使用client_id向用户的声明集合添加声明)

如果用户有有效的cookie,则没有登录屏幕,IdentityServer4会将其重定向回客户端应用程序,并在查询字符串中显示请求的令牌(同意已关闭)。

如果发生此事件,我该如何执行自定义代码?

1 个答案:

答案 0 :(得分:2)

A"登录成功"活动可从Built-In Events获得。遗憾的是,Identity Server事件是面向日志的,因此您必须实现IEventSink来捕获事件,并且您可能无法在不中断其余OIDC流的情况下执行诸如show UI之类的操作。这也意味着除非您在IEventSink实现中手动处理事件,否则您无法记录事件(请参阅DefaultEventSink,它只是将事件序列化为注册注册的任何记录器)。该事件由TokenRequestValidator提出。

首先,启用"成功"配置中的事件......

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

...然后寻找UserLoginSuccessEvent

public class LoginEventSink : IEventSink
{
    public Task PersistAsync(Event evt)
    {
        if(evt.Id.Equals(EventIds.UserLoginSuccess))
        {
            // do stuff
        }
    }
}

其中一个overloads通过将Event.Endpoint设置为UI来告诉您登录是否具有互动性,但我没有看到从IEventSink获取该登录的方法,不确定它是如何使用的。您可以查看OIDC"提示" None的模式,如果你需要的话。

根据您的设置和要求,您还可以在质询返回时在客户端捕获事件,但听起来您希望将其保留在Identity Server中。