mysql membershipprovider_SimpleMembershipProvider 的 MySql 实现

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();

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值