如何使身份服务器会话与外部身份提供程序保持同步



我正在使用IdentityServer4为几个web应用程序提供SSO和SLO。用户可以通过外部OIDC提供商(如Azure AD(登录到身份服务器。外部提供商、身份服务器和web应用程序都配置为使用持续数周或数月的持久会话。

此设置运行良好,用户可以按预期登录。问题是,我要求所有会话保持同步,因此当外部提供程序会话过期时,过期将传播到我的身份服务器,然后传播到web应用程序。

这一要求是为了确保链下游的会话都不会超过其提供商的会话,这将破坏SLO功能。例如,如果我的身份服务器会话比它所依赖的Azure AD会话寿命长,则用户可以再次登录到Azure AD,但由于Azure AD会话已更改,用户将无法通过Azure AD从身份服务器和web应用进行SLO,并且我的身份服务器依赖于现已过期的Azure AD会议。

我能够使用check_session iframe和prompt=none的被动身份验证请求在身份服务器和web应用程序之间强制执行此要求。但我不知道如何在外部提供商和我的身份服务器之间强制执行类似类型的要求,以结束我的身份服务会话并通知我的网络应用程序。

如何使身份服务器会话与外部身份提供程序保持同步?如果无法做到这一点,如何确保SSO和SLO会话不会在外部提供商、身份服务器和web应用程序之间失去同步?

这方面的解决方案是联合签出

联合注销是指用户使用外部身份提供程序登录到identity Server,然后用户通过identity Server未知的工作流注销该外部身份提供器的情况。当用户注销时,通知IdentityServer会很有用,这样它就可以让用户注销Identity Server和所有使用Identity Server的应用程序。

要实现,在将AzureAD添加为外部IDP时需要设置RemoteSignOutPath

services.AddAuthentication()
.AddOpenIdConnect("aad", "Azure AD", options =>
{
options.ClientId = "<Your Application (client) ID>";
options.Authority = "https://login.windows.net/<Directory (tenant) ID>";
options.CallbackPath = "/signin-aad";
options.SignedOutCallbackPath = "/signout-callback-aad";
options.RemoteSignOutPath = "/signout-aad";
});

这里有一个很好的博客用IdentityServer4解释它(底部的参考博客也很有用(

相关内容

最新更新