public UserCredentialSaveReply CredentialUpdate(UserCredentialSaveRequest request)
 {
     throw new NotImplementedException("This method is intended to specific VAR/OEM applications and is not currently implemented for the open source version");
 }
        /// <summary>
        /// Change user's credentials.  Use non-null/non-empty value to indicate credential property to change
        /// </summary>
        /// <param name="request">New credentials to update</param>
        /// <returns>ActionStatus.OK and re/activation key</returns>
        public UserCredentialSaveReply UserCredentialSave(UserCredentialSaveRequest request)
        {
            UserCredentialSaveReply response = new UserCredentialSaveReply();

            try
            {
                //-------------------------------------------------------
                // verify original username and password exists
                //-------------------------------------------------------
                bool verifyUserResult = _membership.ValidateUser(request.OriginalIdentityName, request.OriginalPassword);
                if (verifyUserResult == false)
                {
                    response.Status = ActionStatus.Forbidden;
                    response.Messages.Add(ActionStatus.Forbidden, "Could not verify credentials for: '{0}'.  Account must be active and in good standing to change it's credentials", request.OriginalIdentityName);
                    return(response);
                }
                response.Messages.Add("User '{0}' validated", request.OriginalIdentityName);

                //-------------------------------------------------------
                // change password
                //-------------------------------------------------------
                if (string.IsNullOrEmpty(request.NewPassword) == false)
                {
                    bool changePasswordResult = _membership.ChangePassword(request.OriginalIdentityName, request.OriginalPassword, request.NewPassword);
                    if (changePasswordResult == false)
                    {
                        response.Status = ActionStatus.Forbidden;
                        response.Messages.Add(ActionStatus.Forbidden, "Could not change password for: '{0}'.  Account must be active and in good standing to change it's credentials", request.OriginalIdentityName);
                        return(response);
                    }
                    response.Messages.Add("Password updated");
                }

                //-------------------------------------------------------
                //  change password question & answer
                //-------------------------------------------------------
                bool changeQAResult = _membership.ChangePasswordQuestionAndAnswer(request.OriginalIdentityName, request.OriginalPassword, request.ChallengeQuestion, request.ChallengeAnswer);
                if (string.IsNullOrEmpty(request.ChallengeQuestion) == false && string.IsNullOrEmpty(request.ChallengeAnswer) == false)
                {
                    if (changeQAResult == false)
                    {
                        response.Status = ActionStatus.Forbidden;
                        response.Messages.Add(ActionStatus.Forbidden, "Could not change challenge question/answer for: '{0}'.  Account must be active and in good standing to change it's credentials", request.OriginalIdentityName);
                        return(response);
                    }
                    response.Messages.Add("Challenge question updated");
                }
                //-------------------------------------------------------
                // verify username doesn't already exist
                //-------------------------------------------------------
                string activationKey = Guid.NewGuid().ToString();
                if (string.IsNullOrEmpty(request.NewIdentityName) == false)
                {
                    var tmpUser = _membership.GetUser(request.NewIdentityName, false);
                    if (tmpUser != null)
                    {
                        response.Status = ActionStatus.Conflict;
                        response.Messages.Add(ActionStatus.Conflict, "Requested identity '{0}' already exists.", request.OriginalIdentityName);
                        return(response);
                    }

                    //-------------------------------------------------------
                    //  now update username.  NOTE: make ADO calls since
                    //  SQL membership provider does not have capability to
                    //  change username
                    //-------------------------------------------------------
                    //string sql = "UPDATE aspnet_Users SET username = @user1, loweredUserName = @user2 WHERE userId = @userId;UPDATE aspnet_Membership SET email=@user1, loweredEMail=@user2,IsApproved=0,Comment=@comment where USERID = @userId";
                    //using (SqlConnection cn = new SqlConnection(_membership.dbConnectionString))
                    //{
                    //    using (SqlCommand cmd = cn.CreateCommand())
                    //    {
                    //        cmd.CommandText = sql;
                    //        cmd.CommandType = CommandType.Text;
                    //        cmd.Parameters.AddWithValue("user1", request.NewIdentityName);
                    //        cmd.Parameters.AddWithValue("user2", request.NewIdentityName.ToLower());
                    //        cmd.Parameters.AddWithValue("comment", activationKey);
                    //        throw new NotImplementedException("Need to set @userid");
                    //        cn.Open();
                    //        cmd.ExecuteNonQuery();
                    //        cn.Close();
                    //    }
                    //}
                    //response.Messages.Add("LoginName updated");
                }

                //-------------------------------------------------------
                //  all changes where successful so "deactivate" account so
                //  it can be "reactivated".  Credential changes always
                //  force a "reactivation".
                //-------------------------------------------------------
                var user = _membership.GetUser(request.OriginalIdentityName, true);
                user.Comment    = Guid.NewGuid().ToString();
                user.IsApproved = false;
                _membership.UpdateUser(user);

                response.Messages.Add("Account has been de-verified due to succssful credential change and must be reverified");
                response.ActivationKey = activationKey;
                response.Status        = ActionStatus.OK;
                return(response);
            }
            catch (Exception ex)
            {
                response.Status = ActionStatus.InternalError;
                response.Messages.Add(ex);
                return(response);
            }
        }