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); }