private User ValidateAgainstUserSynchronization(IUserSynchronizedOAuthClientConfiguration configuration, User user, NameValueCollection state, Action<Uri> redirect)
        {
            if (!configuration.EnableEvolutionUserSynchronization || redirect == null)
                return user;

            var evolutionUserName = GetEvolutionAuthenticatedUserName(configuration);
            if (string.IsNullOrEmpty(evolutionUserName))
            {
                if (user != null)
                    return null;
            }
            else if (user == null || (string.CompareOrdinal(evolutionUserName, user.UserName) != 0 && string.CompareOrdinal(evolutionUserName, user.SynchronizedUserName) != 0))
            {
                state[Constants.SynchronizedUserNameQueryStringKey] = evolutionUserName;

                IUserCreatableOAuthClientConfiguration userCreateClient = configuration as IUserCreatableOAuthClientConfiguration;
                userCreateClient = (IUserCreatableOAuthClientConfiguration)configuration;

                if (userCreateClient != null && userCreateClient.EnableEvolutionUserCreation)
                {
                    if (user == null)
                        redirect(GetEvolutionLogOutUrl(configuration, state));
                    else
                        redirect(GetAuthenticatedRedirectUrlInternal(configuration, user.UserName, GetLoginUrl(configuration, state).OriginalString));

                    return user;
                }
                else
                {
                    redirect(GetLoginUrl(configuration, state));
                    return null;
                }

            }

            return user;
        }
        private string GetEvolutionAuthenticatedUserName(IUserSynchronizedOAuthClientConfiguration configuration)
        {
            var value = configuration.GetEvolutionUserSynchronizationCookieValue();
            if (string.IsNullOrEmpty(value))
                return null;

            var queryString = System.Web.HttpUtility.ParseQueryString(value);
            if (queryString != null && !string.IsNullOrEmpty(queryString["lastAuthenticatedUserName"]))
                return queryString["lastAuthenticatedUserName"];
            else
                return null;
        }