首页 文章

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

提问于
浏览
2

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

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

发生此事件时如何执行自定义代码?

1 回答

  • 2

    Built-In Events可以获得"login success"事件 . 遗憾的是,Identity Server事件是面向日志的,因此您必须实现IEventSink来捕获事件,除非您在 IEventSink 实现中手动处理事件,否则您可能会记录事件(请参阅DefaultEventSink,它只是将事件序列化为任何 Logger 注册注射) . 该事件由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 获取它的方法,不确定它是如何使用的 . 如果需要,您可以检查 None 的OIDC "Prompt"模式 .

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

相关问题