Exemplo n.º 1
0
        public async Task <IActionResult> HandleSingleLogoutAsync(SingleLogoutSequenceData sequenceData = null)
        {
            sequenceData = sequenceData ?? await sequenceLogic.GetSequenceDataAsync <SingleLogoutSequenceData>(remove : false);

            if (sequenceData.HostedInIframe && sequenceData.AllowIframeOnDomains?.Count() > 0)
            {
                securityHeaderLogic.AddAllowIframeOnDomains(sequenceData.AllowIframeOnDomains);
            }

            var samlDownPartyId = sequenceData.DownPartyLinks.Where(p => p.Type == PartyTypes.Saml2).Select(p => p.Id).FirstOrDefault();

            var oidcDownPartyIds = sequenceData.DownPartyLinks.Where(p => p.Type == PartyTypes.Oidc).Select(p => p.Id);

            if (oidcDownPartyIds.Count() > 0)
            {
                sequenceData.DownPartyLinks = sequenceData.DownPartyLinks.Where(p => p.Type != PartyTypes.Oidc);
                await sequenceLogic.SaveSequenceDataAsync(sequenceData);

                var doSamlLogoutInIframe = sequenceData.HostedInIframe && samlDownPartyId != null;
                return(await serviceProvider.GetService <OidcFrontChannelLogoutDownLogic <OidcDownParty, OidcDownClient, OidcDownScope, OidcDownClaim> >().LogoutRequestAsync(oidcDownPartyIds, sequenceData, sequenceData.HostedInIframe, doSamlLogoutInIframe));
            }

            if (samlDownPartyId != null)
            {
                sequenceData.DownPartyLinks = sequenceData.DownPartyLinks.Where(p => p.Id != samlDownPartyId);
                await sequenceLogic.SaveSequenceDataAsync(sequenceData);

                return(await serviceProvider.GetService <SamlLogoutDownLogic>().SingleLogoutRequestAsync(samlDownPartyId, sequenceData));
            }

            await sequenceLogic.RemoveSequenceDataAsync <SingleLogoutSequenceData>();

            logger.ScopeTrace(() => "Successful Single Logout.", triggerEvent: true);

            if (sequenceData.HostedInIframe)
            {
                return(new OkResult());
            }
            else
            {
                return(await ResponseUpPartyAsync(sequenceData.UpPartyName, sequenceData.UpPartyType));
            }
        }