usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Security.Cryptography;usingSystem.Transactions;usingSystem.Web;usingSystem.Web.Helpers;usingSystem.Web.Security;usingWebMatrix.WebData;namespaceTestSimpleMembership.Help
{public classMySqlSimpleMembershipProvider : ExtendedMembershipProvider
{private static string DEFAULT_PROVIDER_NAME = "MySQLMembershipProvider";private static string DEFAULT_NAME = "MySqlExtendedMembershipProvider";private static string DEFAULT_PROVIDER_CONFIG_NAME = "provider";privateMembershipProvider preProvider;privateMemberAuthorContext dbContext;privateSystem.Data.Entity.DbSetuserProfiles;privateSystem.Data.Entity.DbSetoAuthMemberships;privateSystem.Data.Entity.DbSetroles;privateSystem.Data.Entity.DbSetusersInRoles;privateSystem.Data.Entity.DbSetmemberships;public override void Initialize(stringname, System.Collections.Specialized.NameValueCollection config)
{if (config == null) throw new ArgumentNullException("config");if (string.IsNullOrEmpty(name)) name =DEFAULT_NAME;base.Initialize(name, config);var providerName =config[DEFAULT_PROVIDER_CONFIG_NAME];if (!string.IsNullOrEmpty(providerName))this.preProvider = Membership.Providers[providerName] ??Membership.Providers[DEFAULT_PROVIDER_NAME];if (this.preProvider != null)this.preProvider.ValidatingPassword += delegate(objectsender, ValidatePasswordEventArgs args)
{this.OnValidatingPassword(args);
};this.dbContext = newMemberAuthorContext();this.userProfiles = this.dbContext.userprofile;this.oAuthMemberships = this.dbContext.webpages_oauthmembership;this.roles = this.dbContext.webpages_roles;this.usersInRoles = this.dbContext.webpages_usersinroles;this.memberships = this.dbContext.webpages_membership;
}public override bool ConfirmAccount(stringaccountConfirmationToken)
{var rsl = from m inmembershipswhere m.ConfirmationToken ==accountConfirmationTokenselect new { UserId = m.UserId, ConfirmationToken =m.ConfirmationToken };if (!rsl.Any()) return false;var user = (from m in memberships where m.UserId == rsl.First().UserId selectm).FirstOrDefault();if (user == null) return false;
user.IsConfirmed= true;
dbContext.SaveChanges();return true;
}public override bool ConfirmAccount(string userName, stringaccountConfirmationToken)
{var rsl = from membership inmemberships
join userProfileinuserProfiles on membership.UserId equals userProfile.UserIdwhere membership.ConfirmationToken == accountConfirmationToken &&userProfile.UserName==userNameselect new { UserId = membership.UserId, ConfirmationToken =membership.ConfirmationToken };if (!rsl.Any()) return false;var user = (from membership in memberships where membership.UserId == rsl.First().UserId selectmembership).FirstOrDefault();if (user == null) return false;
user.IsConfirmed= true;
dbContext.SaveChanges();return true;
}public override string CreateAccount(string userName, string password, boolrequireConfirmationToken)
{if(String.IsNullOrEmpty(password))throw newMembershipCreateUserException(MembershipCreateStatus.InvalidPassword);string passwordHash =Crypto.HashPassword(password);if (passwordHash.Length > 128)throw newMembershipCreateUserException(MembershipCreateStatus.InvalidPassword);if(String.IsNullOrEmpty(userName))throw newMembershipCreateUserException(MembershipCreateStatus.InvalidUserName);var user = (from u in userProfiles where u.UserName == userName selectu).FirstOrDefault();if (user == null)throw newMembershipCreateUserException(MembershipCreateStatus.ProviderError);if ((from m in memberships where m.UserId == user.UserId selectm).Any())throw newMembershipCreateUserException(MembershipCreateStatus.DuplicateUserName);var token = requireConfirmationToken ? GenerateToken() : null;
memberships.Add(newwebpages_membership()
{
UserId=user.UserId,
Password=passwordHash,
CreateDate=DateTime.UtcNow,
IsConfirmed= !requireConfirmationToken,
PasswordFailuresSinceLastSuccess= 0,
PasswordSalt= string.Empty,
ConfirmationToken=token,
PasswordChangedDate=DateTime.UtcNow
});try{
dbContext.SaveChanges();
}catch(Exception e)
{throw newMembershipCreateUserException(MembershipCreateStatus.ProviderError);
}returntoken;
}private stringGenerateToken()
{using (RNGCryptoServiceProvider provider = newRNGCryptoServiceProvider())
{var bytes = new byte[16];
provider.GetBytes(bytes);returnHttpServerUtility.UrlTokenEncode(bytes);
}
}public override string CreateUserAndAccount(string userName, string password, boolrequireConfirmation, IDictionary values)
{using (TransactionScope ts = newTransactionScope())
{if ((from u in userProfiles where u.UserName == userName select u).FirstOrDefault() != null)throw newMembershipCreateUserException(MembershipCreateStatus.DuplicateUserName);
userprofile user= new userprofile() { UserName =userName };
userProfiles.Add(user);
dbContext.SaveChanges();var rsl =CreateAccount(userName, password, requireConfirmation);
ts.Complete();returnrsl;
}
}public override bool DeleteAccount(stringuserName)
{var user = (from u in userProfiles where u.UserName == userName selectu).FirstOrDefault();if (user == null) return false;foreach (var membership in from m in memberships where m.UserId == user.UserId selectm)
memberships.Remove(membership);
dbContext.SaveChanges();return true;
}public override string GeneratePasswordResetToken(string userName, inttokenExpirationInMinutesFromNow)
{if (string.IsNullOrEmpty(userName))throw new ArgumentNullException("userName");var user =getConfirmedUser(userName);if (user == null)throw newInvalidOperationException();var membership = (from m inmembershipswhere m.UserId == user.UserId && m.PasswordVerificationTokenExpirationDate >DateTime.UtcNowselectm).FirstOrDefault();if (membership.PasswordVerificationToken == null)
{
membership.PasswordVerificationToken=GenerateToken();
membership.PasswordVerificationTokenExpirationDate=DateTime.UtcNow.AddMinutes(tokenExpirationInMinutesFromNow);
dbContext.SaveChanges();
}returnmembership.PasswordVerificationToken;
}private webpages_membership getConfirmedUser(stringuserName)
{var rsl = (from u inuserProfiles
join minmemberships on u.UserId equals m.UserIdwhere m.IsConfirmed == true && u.UserName ==userNameselectm).FirstOrDefault();returnrsl;
}public override ICollectionGetAccountsForUser(stringuserName)
{var rsl = newList();foreach (var oAuth in from o inoAuthMemberships
join uinuserProfiles on o.UserId equals u.UserIdwhere u.UserName ==userNameselecto)
{
rsl.Add(newOAuthAccountData(oAuth.Provider, oAuth.ProviderUserId));
}returnrsl;
}public override DateTime GetCreateDate(stringuserName)
{var membership = (from m inmemberships
join uinuserProfiles on m.UserId equals u.UserIdwhere u.UserName ==userNameselectm).FirstOrDefault();return membership == null ?DateTime.MinValue : membership.CreateDate.Value;
}public override DateTime GetLastPasswordFailureDate(stringuserName)
{var membership = (from m inmemberships
join uinuserProfiles on m.UserId equals u.UserIdwhere u.UserName ==userNameselectm).FirstOrDefault();return membership == null || membership.LastPasswordFailureDate.HasValue ?DateTime.MinValue : membership.LastPasswordFailureDate.Value;
}public override DateTime GetPasswordChangedDate(stringuserName)
{var membership = (from m inmemberships
join uinuserProfiles on m.UserId equals u.UserIdwhere u.UserName ==userNameselectm).FirstOrDefault();return membership == null || membership.PasswordChangedDate.HasValue ?DateTime.MinValue : membership.PasswordChangedDate.Value;
}public override int GetPasswordFailuresSinceLastSuccess(stringuserName)
{var membership = (from m inmemberships
join uinuserProfiles on m.UserId equals u.UserIdwhere u.UserName ==userNameselectm).FirstOrDefault();return membership == null ? -1: membership.PasswordFailuresSinceLastSuccess;
}public override int GetUserIdFromPasswordResetToken(stringtoken)
{var user = (from m inmembershipswhere m.PasswordVerificationToken ==tokenselectm).FirstOrDefault();return user == null ? -1: user.UserId;
}public override bool IsConfirmed(stringuserName)
{if (string.IsNullOrEmpty(userName))throw new ArgumentNullException("userName");return getConfirmedUser(userName) != null;
}public override bool ResetPasswordWithToken(string token, stringnewPassword)
{if (string.IsNullOrEmpty(newPassword))throw new ArgumentNullException("newPassword");var user = (from m inmembershipswhere m.PasswordVerificationToken == token && m.PasswordVerificationTokenExpirationDate >DateTime.UtcNowselectm).FirstOrDefault();if (user == null)return false;
user.Password=Crypto.HashPassword(newPassword);
user.PasswordSalt= string.Empty;
user.PasswordChangedDate=DateTime.UtcNow;
user.PasswordVerificationToken= null;
user.PasswordVerificationTokenExpirationDate= null;
dbContext.SaveChanges();return true;
}public override stringApplicationName
{get{if (preProvider == null)throw newNotSupportedException();returnpreProvider.ApplicationName;
}set{if (preProvider == null)throw newNotSupportedException();
preProvider.ApplicationName=value;
}
}public override bool ChangePassword(string username, string oldPassword, stringnewPassword)
{if (preProvider == null) throw newNotSupportedException();returnpreProvider.ChangePassword(username, oldPassword, newPassword);
}public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, stringnewPasswordAnswer)
{if (preProvider == null) throw newNotSupportedException();returnpreProvider.ChangePasswordQuestionAndAnswer(username, password, newPasswordQuestion, newPasswordAnswer);
}public override MembershipUser CreateUser(string username, string password, string email, stringpasswordQuestion,string passwordAnswer, bool isApproved, object providerUserKey, outSystem.Web.Security.MembershipCreateStatus status)
{if (preProvider == null) throw newNotSupportedException();return preProvider.CreateUser(username, password, email, passwordQuestion, passwordAnswer, isApproved, providerUserKey, outstatus);
}public override bool DeleteUser(string username, booldeleteAllRelatedData)
{if (preProvider != null)returnpreProvider.DeleteUser(username, deleteAllRelatedData);foreach (var u in (from u in userProfiles where u.UserName == username selectu))
userProfiles.Remove(u);
dbContext.SaveChanges();return true;
}public override boolEnablePasswordReset
{get { return preProvider != null &&preProvider.EnablePasswordReset; }
}public override boolEnablePasswordRetrieval
{get { return preProvider != null &&preProvider.EnablePasswordRetrieval; }
}public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out inttotalRecords)
{if (preProvider != null)return preProvider.FindUsersByEmail(emailToMatch, pageIndex, pageSize, outtotalRecords);else
throw newNotSupportedException();
}public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out inttotalRecords)
{if (preProvider != null)return preProvider.FindUsersByName(usernameToMatch, pageIndex, pageSize, outtotalRecords);else
throw newNotSupportedException();
}public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out inttotalRecords)
{if (preProvider != null)return preProvider.GetAllUsers(pageIndex, pageSize, outtotalRecords);else
throw newNotSupportedException();
}public override intGetNumberOfUsersOnline()
{if (preProvider != null)returnpreProvider.GetNumberOfUsersOnline();else
throw newNotSupportedException();
}public override string GetPassword(string username, stringanswer)
{if (preProvider != null)returnpreProvider.GetPassword(username, answer);else
throw newNotSupportedException();
}public override MembershipUser GetUser(string username, booluserIsOnline)
{if (preProvider != null)returnpreProvider.GetUser(username, userIsOnline);var user = (from u inuserProfiles
join minmemberships on u.UserId equals m.UserIdwhere u.UserName ==usernameselect new{
UserId=u.UserId,
UserName=u.UserName,
CreateDate=m.CreateDate,
PasswordChangeDate=m.PasswordChangedDate
}).FirstOrDefault();return user == null ? null : newMembershipUser(Membership.Provider.Name,
username, user.UserId,null, null, null, true, false, user.CreateDate.Value,
DateTime.MinValue, DateTime.MinValue, user.PasswordChangeDate.Value, DateTime.MinValue);
}public override MembershipUser GetUser(object providerUserKey, booluserIsOnline)
{if (preProvider != null)returnpreProvider.GetUser(providerUserKey, userIsOnline);throw newNotSupportedException();
}public override string GetUserNameByEmail(stringemail)
{if (preProvider == null)throw newNotSupportedException();returnpreProvider.GetUserNameByEmail(email);
}public override intMaxInvalidPasswordAttempts
{get { return preProvider == null ? int.MaxValue : preProvider.MaxInvalidPasswordAttempts; }
}public override intMinRequiredNonAlphanumericCharacters
{get { return preProvider == null ? 0: preProvider.MinRequiredNonAlphanumericCharacters; }
}public override intMinRequiredPasswordLength
{get { return preProvider == null ? 0: preProvider.MinRequiredPasswordLength; }
}public override intPasswordAttemptWindow
{get { return preProvider == null ? int.MaxValue : preProvider.PasswordAttemptWindow; }
}public overrideMembershipPasswordFormat PasswordFormat
{get { return preProvider == null ?MembershipPasswordFormat.Hashed : preProvider.PasswordFormat; }
}public override stringPasswordStrengthRegularExpression
{get { return preProvider == null ? string.Empty : preProvider.PasswordStrengthRegularExpression; }
}public override boolRequiresQuestionAndAnswer
{get { return preProvider != null &&preProvider.RequiresQuestionAndAnswer; }
}public override boolRequiresUniqueEmail
{get { return preProvider != null &&preProvider.RequiresUniqueEmail; }
}public override string ResetPassword(string username, stringanswer)
{if (preProvider == null)throw newNotSupportedException();returnpreProvider.ResetPassword(username, answer);
}public override bool UnlockUser(stringuserName)
{if (preProvider == null)throw newNotSupportedException();returnpreProvider.UnlockUser(userName);
}public override voidUpdateUser(MembershipUser user)
{if (preProvider == null)throw newNotSupportedException();
preProvider.UpdateUser(user);
}public override bool ValidateUser(string username, stringpassword)
{if (preProvider != null)returnpreProvider.ValidateUser(username, password);if (string.IsNullOrEmpty(username))throw new ArgumentNullException("username");if (string.IsNullOrEmpty(password))throw new ArgumentNullException("password");var user =getConfirmedUser(username);if (user == null)return false;var rsl = user.Password != null &&Crypto.VerifyHashedPassword(user.Password, password);if(rsl)
user.PasswordFailuresSinceLastSuccess= 0;else{
user.PasswordFailuresSinceLastSuccess+= 1;
user.LastPasswordFailureDate=DateTime.UtcNow;
}
dbContext.SaveChanges();returnrsl;
}public override bool HasLocalAccount(intuserId)
{return (from m in memberships where m.UserId == userId selectm).Any();
}public override void CreateOrUpdateOAuthAccount(string provider, string providerUserId, stringuserName)
{if (string.IsNullOrEmpty(userName))throw newMembershipCreateUserException(MembershipCreateStatus.ProviderError);var user = (from u in userProfiles where u.UserName == userName selectu).FirstOrDefault();if (user == null)throw newMembershipCreateUserException(MembershipCreateStatus.InvalidUserName);var oAuthUser = (from o in oAuthMemberships where o.Provider ==provider.ToUpperInvariant()&& o.ProviderUserId == providerUserId.ToUpperInvariant() selecto).FirstOrDefault();if (oAuthUser == null)
{
oAuthMemberships.Add(newwebpages_oauthmembership()
{
Provider=provider.ToUpperInvariant(),
ProviderUserId=providerUserId.ToUpperInvariant(),
UserId=user.UserId
});
}else{
oAuthUser.UserId=user.UserId;
}
dbContext.SaveChanges();
}public override void DeleteOAuthAccount(string provider, stringproviderUserId)
{foreach (var oauth in (from o in oAuthMemberships where o.ProviderUserId ==providerUserId.ToUpperInvariant()&& o.Provider == providerUserId.ToUpperInvariant() selecto))
oAuthMemberships.Remove(oauth);
dbContext.SaveChanges();
}public override void DeleteOAuthToken(stringtoken)
{foreach (var t in (from o in dbContext.webpages_oauthtoken where o.Token == token selecto))
dbContext.webpages_oauthtoken.Remove(t);
dbContext.SaveChanges();
}public override string GetOAuthTokenSecret(stringtoken)
{var secret = (from o in dbContext.webpages_oauthtoken where o.Token == token selecto).FirstOrDefault();return secret == null ? null: secret.Secret;
}public override string GetUserNameFromId(intuserId)
{var user = (from u in userProfiles where u.UserId == userId selectu).FirstOrDefault();return user == null ? null: user.UserName;
}public override int GetUserIdFromOAuth(string provider, stringproviderUserId)
{var user = (from u inoAuthMembershipswhere u.Provider == provider.ToUpperInvariant() && u.ProviderUserId ==provider.ToUpperInvariant()selectu).FirstOrDefault();return user == null ? -1: user.UserId;
}public override void ReplaceOAuthRequestTokenWithAccessToken(string requestToken, string accessToken, stringaccessTokenSecret)
{using (TransactionScope ts = newTransactionScope())
{foreach (var oauth in (from o in dbContext.webpages_oauthtoken where o.Token == requestToken selecto))
dbContext.webpages_oauthtoken.Remove(oauth);
dbContext.SaveChanges();
StoreOAuthRequestToken(accessToken, accessTokenSecret);
ts.Complete();
}
}public override void StoreOAuthRequestToken(string requestToken, stringrequestTokenSecret)
{var secret = (from oauth in dbContext.webpages_oauthtoken where oauth.Token == requestToken selectoauth).FirstOrDefault();if (secret == null)
{
dbContext.webpages_oauthtoken.Add(newwebpages_oauthtoken()
{
Token=requestToken,
Secret=requestTokenSecret
});
}else{
secret.Secret=requestTokenSecret;
}
dbContext.SaveChanges();
}
}
}