public IActionResult Logout(string logoutId = null) { var vm = new AccountModels.LogoutViewModel { LogoutId = logoutId, Name = User.Identity.Name, }; return(View(vm)); }
public async Task <IActionResult> Logout(AccountModels.LogoutViewModel model) { var idp = User?.FindFirst(JwtClaimTypes.IdentityProvider)?.Value; if (idp != null && idp != IdentityServerConstants.LocalIdentityProvider) { if (model.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 model.LogoutId = await _interaction.CreateLogoutContextAsync(); } string url = "/Account/Logout?logoutId=" + model.LogoutId; try { // hack: try/catch to handle social providers that throw await HttpContext.SignOutAsync(idp, new AuthenticationProperties { RedirectUri = url, }); } catch (Exception ex) { _logger.LogError(ex, "LOGOUT ERROR: {ExceptionMessage}", ex.Message); } } // delete authentication cookie await HttpContext.SignOutAsync(); await HttpContext.SignOutAsync(IdentityConstants.ApplicationScheme); // 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); if (logout is null || string.IsNullOrEmpty(logout.PostLogoutRedirectUri)) { return(RedirectToAction(nameof(Login))); }