예제 #1
0
        public async virtual Task SignOutAsync(AuthenticationProperties properties)
        {
            var target = ResolveTarget(Options.ForwardSignOut);

            if (target != null)
            {
                await Context.SignOutAsync(target, properties);

                return;
            }

            string authenticationRequestId = Guid.NewGuid().ToString();

            var requestProperties = new AuthenticationProperties();

            requestProperties.Load(Request, Options.StateDataFormat);

            // Extract the user state from properties and reset.
            var idpName       = requestProperties.GetIdentityProviderName();
            var subjectNameId = requestProperties.GetSubjectNameId();
            var sessionIndex  = requestProperties.GetSessionIndex();

            var idp = Options.IdentityProviders.FirstOrDefault(i => i.Name == idpName);

            var securityTokenCreatingContext = await _eventsHandler.HandleSecurityTokenCreatingContext(Context, Scheme, Options, properties, authenticationRequestId);

            var message = SamlHandler.GetLogoutRequest(
                authenticationRequestId,
                securityTokenCreatingContext.TokenOptions.EntityId,
                securityTokenCreatingContext.TokenOptions.Certificate,
                idp,
                subjectNameId,
                sessionIndex);

            var(redirectHandled, afterRedirectMessage) = await _eventsHandler.HandleRedirectToIdentityProviderForSignOut(Context, Scheme, Options, properties, message);

            if (redirectHandled)
            {
                return;
            }
            message = afterRedirectMessage;

            properties.SetLogoutRequest(message);
            properties.Save(Response, Options.StateDataFormat);

            await _requestGenerator.HandleRequest(message,
                                                  message.ID,
                                                  securityTokenCreatingContext.TokenOptions.Certificate,
                                                  idp.SingleSignOutServiceUrl,
                                                  idp.Method);
        }