private async Task <LoggedOutViewModel> BuildLoggedOutViewModelAsync(string logoutId)
        {
            // 获取上下文信息(联合注销的客户端名称,发布注销重定向URI和iframe)
            var logout = await _interaction.GetLogoutContextAsync(logoutId);

            var vm = new LoggedOutViewModel
            {
                AutomaticRedirectAfterSignOut = AccountOptions.AutomaticRedirectAfterSignOut,
                PostLogoutRedirectUri         = logout?.PostLogoutRedirectUri,
                ClientName       = string.IsNullOrEmpty(logout?.ClientName) ? logout?.ClientId : logout?.ClientName,
                SignOutIframeUrl = logout?.SignOutIFrameUrl,
                LogoutId         = logoutId
            };

            if (User?.Identity.IsAuthenticated == true)
            {
                var idp = User.FindFirst(JwtClaimTypes.IdentityProvider)?.Value;
                if (idp != null && idp != IdentityServer4.IdentityServerConstants.LocalIdentityProvider)
                {
                    var providerSupportsSignout = await HttpContext.GetSchemeSupportsSignOutAsync(idp);

                    if (providerSupportsSignout)
                    {
                        if (vm.LogoutId == null)
                        {
                            // 如果没有当前的注销上下文,我们需要创建一个
                            // 这会捕获当前登录用户的必要信息
                            // 在我们退出并重定向到外部IdP以进行注销之前
                            vm.LogoutId = await _interaction.CreateLogoutContextAsync();
                        }

                        vm.ExternalAuthenticationScheme = idp;
                    }
                }
            }

            return(vm);
        }
        private async Task <LoggedOutViewModel> BuildLoggedOutViewModelAsync(string logoutId)
        {
            // get context information (client name, post logout redirect URI and iframe for federated signout)
            var logout = await _interaction.GetLogoutContextAsync(logoutId);

            var vm = new LoggedOutViewModel
            {
                AutomaticRedirectAfterSignOut = AccountOptions.AutomaticRedirectAfterSignOut,
                PostLogoutRedirectUri         = logout?.PostLogoutRedirectUri,
                ClientName       = string.IsNullOrEmpty(logout?.ClientName) ? logout?.ClientId : logout?.ClientName,
                SignOutIframeUrl = logout?.SignOutIFrameUrl,
                LogoutId         = logoutId
            };

            if (User?.Identity.IsAuthenticated == true)
            {
                var idp = User.FindFirst(JwtClaimTypes.IdentityProvider)?.Value;
                if (idp != null && idp != IdentityServer4.IdentityServerConstants.LocalIdentityProvider)
                {
                    var providerSupportsSignout = await HttpContext.GetSchemeSupportsSignOutAsync(idp);

                    if (providerSupportsSignout)
                    {
                        if (vm.LogoutId == null)
                        {
                            // if there's no current logout context, we need to create one
                            // this captures necessary info from the current logged in user
                            // before we signout and redirect away to the external IdP for signout
                            vm.LogoutId = await _interaction.CreateLogoutContextAsync();
                        }

                        vm.ExternalAuthenticationScheme = idp;
                    }
                }
            }

            return(vm);
        }
示例#3
0
        private async Task <IHttpActionResult> RenderLoggedOutPage(string id)
        {
            Logger.Info("rendering logged out page");

            var baseUrl    = context.GetIdentityServerBaseUrl();
            var iframeUrls = options.RenderProtocolUrls(baseUrl, sessionCookie.GetSessionId());

            var message     = signOutMessageCookie.Read(id);
            var redirectUrl = message != null ? message.ReturnUrl : null;
            var clientName  = await clientStore.GetClientName(message);

            var loggedOutModel = new LoggedOutViewModel
            {
                SiteName          = options.SiteName,
                SiteUrl           = baseUrl,
                IFrameUrls        = iframeUrls,
                ClientName        = clientName,
                RedirectUrl       = redirectUrl,
                AutoRedirect      = options.AuthenticationOptions.EnablePostSignOutAutoRedirect,
                AutoRedirectDelay = options.AuthenticationOptions.PostSignOutAutoRedirectDelay
            };

            return(new LoggedOutActionResult(viewService, loggedOutModel, message));
        }
示例#4
0
        public async Task <IActionResult> Logout(LogoutViewModel model)
        {
            var idp = User?.FindFirst(JwtClaimTypes.IdentityProvider)?.Value;

            if (idp != null && idp != "local")
            {
                string url = "/Account/Logout?logoutId=" + model.LogoutId;
                try
                {
                    await HttpContext.Authentication.SignOutAsync(idp, new AuthenticationProperties { RedirectUri = url });
                }
                catch (Exception ex)
                {
                    _logger.LogError("Cannot sign out! IDP : {0}. Reason : {1}", idp, ex);
                }
            }
            // delete authentication cookie

            await HttpContext.Authentication.SignOutAsync();

            // await HttpContext.Authentication.CustomHandleSignOutAsync(Request, Response, null);
            // set this so UI rendering sees an anonymous user
            HttpContext.User = new ClaimsPrincipal(new ClaimsIdentity());

            // get context information (client name, post logout redirect URI and iframe for federated signout)
            var logout = await _interaction.GetLogoutContextAsync(model.LogoutId);

            var vm = new LoggedOutViewModel
            {
                PostLogoutRedirectUri = logout?.PostLogoutRedirectUri,
                ClientName            = logout?.ClientId,
                SignOutIframeUrl      = logout?.SignOutIFrameUrl
            };

            return(View("LoggedOut", vm));
        }
示例#5
0
        public async Task <IActionResult> Logout(LogoutViewModel model)
        {
            // delete authentication cookie
            await HttpContext.Authentication.SignOutAsync();

            // set this so UI rendering sees an anonymous user
            HttpContext.User = new ClaimsPrincipal(new ClaimsIdentity());

            // get context information (client name, post logout redirect URI and iframe for federated signout)
            var logout = await _interaction.GetLogoutContextAsync(model.LogoutId);

            var authenticationManager = HttpContext.Authentication;

            authenticationManager.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme).Wait();

            var vm = new LoggedOutViewModel
            {
                PostLogoutRedirectUri = logout?.PostLogoutRedirectUri,
                ClientName            = logout?.ClientId,
                SignOutIframeUrl      = logout?.SignOutIFrameUrl
            };

            return(View("LoggedOut", vm));
        }
 /// <summary>
 /// Loads the HTML for the logged out page informing the user that they have successfully logged out.
 /// </summary>
 /// <param name="model">
 /// The model.
 /// </param>
 /// <returns>
 /// The <see cref="ActionResult"/>.
 /// </returns>
 public ActionResult LoggedOut(LoggedOutViewModel model)
 {
     return(this.View(model));
 }
 /// <summary>
 /// Loads the HTML for the logged out page informing the user that they have successfully logged out.
 /// </summary>
 /// <param name="model">The model.</param>
 /// <param name="message">The message.</param>
 /// <returns>
 /// Stream for the HTML
 /// </returns>
 public virtual Task <Stream> LoggedOut(LoggedOutViewModel model, SignOutMessage message)
 {
     return(Render(model, LoggedOutView));
 }
 public Task <Stream> LoggedOut(LoggedOutViewModel model, SignOutMessage message)
 {
     return(Render(model, "loggedOut"));
 }
 public virtual Task<System.IO.Stream> LoggedOut(IDictionary<string, object> env, LoggedOutViewModel model)
 {
     return Render(model, "loggedOut");
 }
示例#10
0
 public async Task <Stream> LoggedOut(LoggedOutViewModel model, SignOutMessage message)
 {
     return(await Render(model, "LoggedOut"));
 }
 public LoggedOutActionResult(IViewService viewSvc, IDictionary <string, object> env, LoggedOutViewModel model)
     : base(async() => await viewSvc.LoggedOut(env, model))
 {
     if (viewSvc == null)
     {
         throw new ArgumentNullException("viewSvc");
     }
     if (env == null)
     {
         throw new ArgumentNullException("env");
     }
     if (model == null)
     {
         throw new ArgumentNullException("model");
     }
 }
示例#12
0
 public IActionResult LoggedOut(LoggedOutViewModel model)
 {
     return(View(model));
 }
示例#13
0
 public Task <Stream> LoggedOut(LoggedOutViewModel model, SignOutMessage message)
 {
     return(Task.FromResult(RunTemplate("loggedout", model, message?.ClientId)));
 }
 public void OnGet(LoggedOutViewModel loggedOutViewModel)
 {
     LoggedOutViewModel = loggedOutViewModel;
 }
 public virtual Task <System.IO.Stream> LoggedOut(IDictionary <string, object> env, LoggedOutViewModel model)
 {
     return(Render(model, "loggedOut"));
 }
 /// <summary>
 /// Loads the HTML for the logged out page informing the user that they have successfully logged out.
 /// </summary>
 /// <param name="model">The model.</param>
 /// <returns>
 /// Stream for the HTML
 /// </returns>
 public virtual Task <Stream> LoggedOut(LoggedOutViewModel model)
 {
     return(Render(model, "loggedOut"));
 }
示例#17
0
 /// <summary>
 /// Перегруженная версия функции <see cref="DefaultViewService.LoggedOut(LoggedOutViewModel, SignOutMessage)"/>,
 /// из которой удалено вывод имени клиента.
 /// </summary>
 /// <param name="model">
 /// Объект <see cref="LoggedOutViewModel"/>, содержит имя клиента, которое в методе приравнивается null.
 /// </param>
 /// <param name="message">Объект <see cref="SignOutMessage"/>.</param>
 /// <returns>
 /// Возвращаемое значение базового класса <see cref="DefaultViewService"/>, на вход которого
 /// подаётся модель <see cref="LoggedOutViewModel"/> с отстутствующим именем клиента.
 /// </returns>
 public override Task <Stream> LoggedOut(LoggedOutViewModel model, SignOutMessage message)
 {
     model.ClientName = null;
     return(base.LoggedOut(model, message));
 }