客户端应用程序正在重定向到IdentityServer4实例 - " / connect / authorize / callback"?client_id = ..."。 如果用户未登录(没有cookie),则会将其重定向到“登录”页面,并且在回发时我可以执行随机逻辑(将用户订阅到此客户端 - 使用client_id向用户的声明集合添加声明)
如果用户有有效的cookie,则没有登录屏幕,IdentityServer4会将其重定向回客户端应用程序,并在查询字符串中显示请求的令牌(同意已关闭)。
如果发生此事件,我该如何执行自定义代码?
答案 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中。