Federated 的登出后重定向


layout: docs-default

Federated 的登出后重定向

当客户端程序登出IdentityServer的时候,一个"post-logout redirect uri"会被发送给用户,以便在完全退出后重定向回客户端。这个信息维护在"sign out message"cookie里,通过唯一的"sign out message id"来标识。这个标识通过查询字符串来传给”logged out"页面,这样可以访问这个cookie来重定向用户回客户端应用。

如果IdentityServer使用一个上游的身份认证,当用户从IdentityServer 登出的时候,也会重定向到第三方认证来退出。如果第三方认证提供 "post logout redirect uri" 功能, 那么一旦用户被重定向回IdentityServer,这个"sign in message id" 会丢掉.

IdentityServer支持在重定向到第三方认证前获取和保存 "sign out message id"。一旦用户被重定向回IdentityServer,可以使用这个"sign out message id" 来显示IdentityServer的登出界面,这个界面有一个链接可以退回到用户程序。
这种方式需要托管程序在重定向前拿到"sign out message id"。通过调用 IdentityServer OWIN environment extensionsGetSignOutMessageId 方法。我们的逻辑代码需要保存这个标识(比如到cookie)

这个同样需要在托管程序中定义个 "post logout redirect" endpoint (这个endpoint需要在尚有的认证服务注册). 当第三方认证登出时,这个endpoint像一个回调函数一样。当这个回调被调用的时候,可以显示一个IdentityServer的“logged out page"(通过调用IdentityServer OWIN environment extensionsRenderLoggedOutViewAsync ).这个"sign in message id" 会做为参数传过来。

详情可以参考下面的代码:

public void Configuration(this IAppBuilder app)
{
   app.Map("/core", coreApp =>
   {
      var factory = new IdentityServerServiceFactory();

      // ...

      coreApp.UseIdentityServer(idsrvOptions);
      
      coreApp.Map("/signoutcallback", cleanup =>
      {
         cleanup.Run(async ctx =>
         {
            var state = ctx.Request.Cookies["state"];
            await ctx.Environment.RenderLoggedOutViewAsync(state);
         });
      });
   });
}

public static void ConfigureIdentityProviders(IAppBuilder app, string signInAsType)
{
    var oidc = new OpenIdConnectAuthenticationOptions
    {
        AuthenticationType = "oidc",
        Caption = "External IdP",
        SignInAsAuthenticationType = signInAsType,
        // ...
        Notifications = new OpenIdConnectAuthenticationNotifications
        {
            RedirectToIdentityProvider = n =>
            {
                if (n.ProtocolMessage.RequestType == Microsoft.IdentityModel.Protocols.OpenIdConnectRequestType.LogoutRequest)
                {
                    // ...
                
                    var signOutMessageId = n.OwinContext.Environment.GetSignOutMessageId();
                    if (signOutMessageId != null)
                    {
                        n.OwinContext.Response.Cookies.Append("state", signOutMessageId);
                    }
                }
                return Task.FromResult(0);
            }
        }
    };
    app.UseOpenIdConnectAuthentication(oidc);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 本教程会介绍如何在前端JS程序中集成IdentityServer。因为所有的处理都在前端,我们会使用一个JS库oi...
    灭蒙鸟阅读 12,467评论 5 16
  • 术语http://www.tuicool.com/articles/2mQjIr 本文翻译自IdentitySer...
    灭蒙鸟阅读 12,623评论 1 13
  • 4 创建一个社交网站 在上一章中,你学习了如何创建站点地图和订阅,并且为博客应用构建了一个搜索引擎。在这一章中,你...
    lakerszhy阅读 6,537评论 0 7
  • 上一篇分析了 接入设备 在接入路由器,并发起首次 HTTP/80 请求到路由器上时,wifidog 是如何将此 H...
    3c937c88e6c0阅读 5,418评论 0 2
  • 主要介绍CAS SSO的认证流程。有关这方面的内容再网上也有很多资料,写这篇总结目的一来是自己在理解这块内容的时候...
    spilledyear阅读 13,290评论 1 17

友情链接更多精彩内容