You are probably stuffed. You are getting that message because most of the user account exists, there is just 1 piece missing - the aspnet_Membership record. The trouble is that the aspnet_Membership record contains the user's password in encrypted format (amongst other things), so its not easy to recreate.
The only reason I was able to recreate the record was that my DNN was version 4.3.5 upgraded from an early 3.x version. In early 3.x versions the aspnet_Membership table contained multiple records for each user, and many of these had been "left behind". In other words the aspnet_Membership record that DNN 4.3.5 needed was gone but there were many other almost identical ones still in the table that I could base my replacement record on.
Run this SQL query to identify your corrupted user account(s) and also see if it has any old aspnet_Membership records that could be used to recreate the needed aspnet_Membership record:
select u.*, am2.*
from users u
join aspnet_Users au on u.username = au.username
cross join aspnet_Applications aa
left join aspnet_Membership am on au.userid = am.userid and aa.applicationid = am.applicationid
left join aspnet_Membership am2 on au.userid = am2.userid and aa.applicationid <> am2.applicationid
where aa.applicationname = 'DotNetNuke'
and am.userid is null
The columns UserID-UpdatePassword should identify the corrupted user account. If there is data under the next columns (ApplicationID, UserID ......) then you have an old aspnet_Membership record. If so, try running this to use it to recreate the missing one:
insert aspnet_Membership (ApplicationId,UserId,Password,PasswordFormat,PasswordSalt,MobilePIN,Email,LoweredEmail,PasswordQuestion,PasswordAnswer,IsApproved,IsLockedOut,CreateDate,LastLoginDate,LastPasswordChangedDate,LastLockoutDate,FailedPasswordAttemptCount,FailedPasswordAttemptWindowStart,FailedPasswordAnswerAttemptCount,FailedPasswordAnswerAttemptWindowStart,Comment)
select distinct aa.ApplicationId,au.UserId,am2.Password,am2.PasswordFormat,am2.PasswordSalt,am2.MobilePIN,u.Email,lower(u.Email) as LoweredEmail,am2.PasswordQuestion,am2.PasswordAnswer,1 as IsApproved,0 as IsLockedOut,am2.CreateDate,am2.LastLoginDate,am2.LastPasswordChangedDate,am2.LastLockoutDate,am2.FailedPasswordAttemptCount,am2.FailedPasswordAttemptWindowStart,am2.FailedPasswordAnswerAttemptCount,am2.FailedPasswordAnswerAttemptWindowStart,am2.Comment
from users u
join aspnet_Users au on u.username = au.username
cross join aspnet_Applications aa
left join aspnet_Membership am on au.userid = am.userid and aa.applicationid = am.applicationid
join aspnet_Membership am2 on au.userid = am2.userid and aa.applicationid <> am2.applicationid
where aa.applicationname = 'DotNetNuke'
and am.userid is null
Note that this may restore the account with a password that it had in the past but not its most recent password.