public override LoginResult process(LoginData loginData)
        {
            if (loginData.isRememberLogin())
            {
                this.userSession.createRememberMeToken(loginData.getUser());
            }

            return(this.processNextOrFinishSuccessfully(loginData));
        }
        public override LoginResult process(LoginData loginData)
        {
            if (!this.twoFactorManager.isTwoFactorAuthenticated(loginData.getUser()))
            {
                return(this.processNextOrFinishSuccessfully(loginData));
            }

            this.twoFactorManager.prepareTwoFactorLogin(loginData.getUser(), loginData.isRememberLogin());
            var providerSet    = this.twoFactorManager.getProviderSet(loginData.getUser());
            var loginProviders = this.twoFactorManager.getLoginSetupProviders(loginData.getUser());
            var providers      = providerSet.getPrimaryProviders();
            var url            = "";
            var urlParams      = new Dictionary <string, string>();

            if (providers.IsEmpty() && !providerSet.isProviderMissing() && loginProviders.IsNotEmpty() && this.mandatoryTwoFactor.isEnforcedFor(loginData.getUser()))
            {
                url       = "core.TwoFactorChallenge.setupProviders";
                urlParams = new Dictionary <string, string>();
            }
            else if (!providerSet.isProviderMissing() && providers.Count == 1)
            {
                var provider = providers[0];
                url       = "core.TwoFactorChallenge.showChallenge";
                urlParams = new Dictionary <string, string>()
                {
                    { "challengeProviderId", provider.getId() }
                };
            }
            else
            {
                url       = "core.TwoFactorChallenge.selectChallenge";
                urlParams = new Dictionary <string, string>();
            }

            if (loginData.getRedirectUrl() != null)
            {
                urlParams = new Dictionary <string, string>()
                {
                    { "redirect_url", loginData.getRedirectUrl() }
                };
            }
            return(LoginResult.success(loginData, this.urlGenerator.linkToRoute(url, urlParams)));
        }