public async Task <IActionResult> LogoutRequestAsync(IEnumerable <string> partyIds, SingleLogoutSequenceData sequenceData) { var frontChannelLogoutRequest = new FrontChannelLogoutRequest { Issuer = trackIssuerLogic.GetIssuer(), SessionId = sequenceData.Claims.FindFirstValue(c => c.Claim == JwtClaimTypes.SessionId) }; var nameValueCollection = frontChannelLogoutRequest.ToDictionary(); TParty firstParty = null; var partyLogoutUrls = new List <string>(); foreach (var partyId in partyIds) { try { var party = await tenantRepository.GetAsync <TParty>(partyId); if (party.Client == null) { throw new NotSupportedException("Party Client not configured."); } if (party.Client.FrontChannelLogoutUri.IsNullOrWhiteSpace()) { throw new Exception("Front channel logout URI not configured."); } firstParty = party; if (party.Client.FrontChannelLogoutSessionRequired) { partyLogoutUrls.Add(QueryHelpers.AddQueryString(party.Client.FrontChannelLogoutUri, nameValueCollection)); } else { partyLogoutUrls.Add(party.Client.FrontChannelLogoutUri); } } catch (Exception ex) { logger.Warning(ex, $"Unable to get front channel logout for party ID '{partyId}'."); } } if (partyLogoutUrls.Count() <= 0 || firstParty == null) { throw new InvalidOperationException("Unable to complete front channel logout. Please close the browser to logout."); } securityHeaderLogic.AddFrameSrc(partyLogoutUrls); var redirectUrl = HttpContext.GetDownPartyUrl(firstParty.Name, sequenceData.UpPartyName, Constants.Routes.OAuthController, Constants.Endpoints.FrontChannelLogoutDone, includeSequence: true); return(partyLogoutUrls.ToHtmIframePage(redirectUrl, "FoxIDs").ToContentResult()); }
public async Task <IActionResult> LogoutRequestAsync(IEnumerable <string> partyIds, SingleLogoutSequenceData sequenceData, bool hostedInIframe, bool doSamlLogoutInIframe) { var frontChannelLogoutRequest = new FrontChannelLogoutRequest { Issuer = trackIssuerLogic.GetIssuer(), SessionId = sequenceData.Claims.FindFirstValue(c => c.Claim == JwtClaimTypes.SessionId) }; var nameValueCollection = frontChannelLogoutRequest.ToDictionary(); TParty firstParty = null; var partyLogoutUrls = new List <string>(); foreach (var partyId in partyIds) { try { var party = await tenantRepository.GetAsync <TParty>(partyId); if (party.Client == null) { throw new NotSupportedException("Party Client not configured."); } if (party.Client.FrontChannelLogoutUri.IsNullOrWhiteSpace()) { throw new Exception("Front channel logout URI not configured."); } firstParty = party; if (party.Client.FrontChannelLogoutSessionRequired) { partyLogoutUrls.Add(QueryHelpers.AddQueryString(party.Client.FrontChannelLogoutUri, nameValueCollection)); } else { partyLogoutUrls.Add(party.Client.FrontChannelLogoutUri); } } catch (Exception ex) { logger.Warning(ex, $"Unable to get front channel logout for party ID '{partyId}'."); } } if (partyLogoutUrls.Count() <= 0 || firstParty == null) { throw new InvalidOperationException("Unable to complete front channel logout. Please close the browser to logout."); } if (doSamlLogoutInIframe) { securityHeaderLogic.AddFrameSrcAllowAll(); // Start SAML logout partyLogoutUrls.Add(GetFrontChannelLogoutDoneUrl(sequenceData, firstParty)); } else { securityHeaderLogic.AddFrameSrcUrls(partyLogoutUrls); } string redirectUrl = hostedInIframe ? null : GetFrontChannelLogoutDoneUrl(sequenceData, firstParty); return(partyLogoutUrls.ToHtmIframePage(redirectUrl, "FoxIDs").ToContentResult()); }