认 证我一直用的是微软的 Membership 体系,看 MySql 也实现了对应的 Provider,在新建立了一个 MVC4 项目后,把 Provider 一改就直接启动,然后就出错了。异常是“To call this method, the “Membership.Provider”property must be an instance of “ExtendedMembershipProvider”.

其原因是微软引进了一个叫 SimpleMembershipProvider 的东西。这个东西确实在数据库端做了大量的简化,根本没用到任何存储过程,表的数量也减少了很多,并且提供了与其它网站进行登录的功能。在 缺省情况下,WebMatrix.WebData.WebSecurity 利用 PreApplicationStart这个技术,在程序启动时将全局变量 Membership 中的"AspNetSqlMembershipProvider"与 Roles 中的"AspNetSqlRoleProvider"这两个 Provider 分别替换为 SimpleMembershipProvider 与 SimpleRoleProvider,于是在什么也没有改变的表面下,传统的 Membeship 体系就被 SimpleMembership 给代替了。从这个替换的动作就可以发现,微软写的 SimpleMembership 根本就是为自家的 SqlServer 服务的,如果你用 IlSpy 去看 SimpleMembershipProvider 的代码的话,就会看到 SqlServer 的 T-Sql 语法直接写在了代码中,直接使用这个 SimpleMembership 去连接 MySql 的话,是会出错的。

而 如果你直接用 MySql 的 Provider 的话,在 WebSecurity 中又会检查这个 Provider 是不是继承至微软新加入的 ExtendedMembershipProvider,当然,第三方怎么会跟的上微软这么自私的举动,于是上面那个异常就出现了。

在 各种网站的问答栏中,有人推荐把这个放在 Web.config 的中,其实这个只是阻止了上面 WebSecurity 将系统的 maching.config 中配置的缺省 AspNetSql 系列的 Provider 用它的 Simple 系统的 Provider 来代替而已,如果你用的是自定义的 Membership,那么这个 enableSimpleMembership 的设置是无用的。所以解决方法要么是不要使用微软给你的那个套登录验证机制,要么自己写一个 Provider 来实现。

下面来说正经的吧。在 WebSecurity 中如果使用的是SimpleMembershipProvider 那么会自动调用建表语句在数据库中建立要使用的表结构。如果不是 SimpleMembershipProvider 的话,则没有这个动作,所以建表要自己手动完成,或者在自定义的 Provider 中找合适的地方实现。在此,我直接用手动建立了表结构。

Create Table UserProfile (UserId int not null primary key auto_increment, UserName varchar(256) not null);

Create Table webpages_Membership (UserId int not null primary key, CreateDate datetime NULL, ConfirmationToken varchar(128) NULL,
IsConfirmed bit NULL, LastPasswordFailureDate datetime NULL, PasswordFailuresSinceLastSuccess int NOT NULL,
Password varchar(128) NOT NULL, PasswordChangedDate datetime NULL, PasswordSalt varchar(128) NOT NULL,
PasswordVerificationToken varchar(128) NULL, PasswordVerificationTokenExpirationDate datetime NULL); Create Table webpages_OAuthMembership (Provider varchar(30) not null, ProviderUserId varchar(100) not null, UserId int not null); Alter Table webpages_OAuthMembership Add Primary Key (Provider, ProviderUserId); Create Table webpages_OAuthToken (Token varchar(100) not null primary key, Secret varchar(100) not null); Create Table webpages_Roles (RoleId int not null primary key auto_increment, RoleName varchar(256) not null); Create Table webpages_UsersInRoles (UserId int not null, RoleId int not null); Alter Table webpages_UsersInRoles Add Primary Key (UserId, RoleId);

在 SimpleMembershipProvider 中,微软写进了大量的 Sql 代码,个人不喜欢这么做,于是就使用 LinqToEF 来实现数据端的操作。映射 EF 这个事情,你们比我懂,我就不说了。下面直接贴 MembershipProvider 的代码吧。在代码中,我的映射的 EF 叫 MembersAuthorContext。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Transactions;
using System.Web;
using System.Web.Helpers;
using System.Web.Security;
using WebMatrix.WebData; namespace TestSimpleMembership.Help
{
public class MySqlSimpleMembershipProvider : ExtendedMembershipProvider
{
private static string DEFAULT_PROVIDER_NAME = "MySQLMembershipProvider";
private static string DEFAULT_NAME = "MySqlExtendedMembershipProvider";
private static string DEFAULT_PROVIDER_CONFIG_NAME = "provider"; private MembershipProvider preProvider;
private MemberAuthorContext dbContext;
private System.Data.Entity.DbSetuserProfiles;
private System.Data.Entity.DbSetoAuthMemberships;
private System.Data.Entity.DbSetroles;
private System.Data.Entity.DbSetusersInRoles;
private System.Data.Entity.DbSetmemberships; public override void Initialize(string name, 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(object sender, ValidatePasswordEventArgs args)
{
this.OnValidatingPassword(args);
}; this.dbContext = new MemberAuthorContext();
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(string accountConfirmationToken)
{
var rsl = from m in memberships
where m.ConfirmationToken == accountConfirmationToken
select new { UserId = m.UserId, ConfirmationToken = m.ConfirmationToken }; if (!rsl.Any()) return false; var user = (from m in memberships where m.UserId == rsl.First().UserId select m).FirstOrDefault();
if (user == null) return false; user.IsConfirmed = true;
dbContext.SaveChanges();
return true;
} public override bool ConfirmAccount(string userName, string accountConfirmationToken)
{
var rsl = from membership in memberships
join userProfile in userProfiles on membership.UserId equals userProfile.UserId
where membership.ConfirmationToken == accountConfirmationToken &&
userProfile.UserName == userName
select new { UserId = membership.UserId, ConfirmationToken = membership.ConfirmationToken }; if (!rsl.Any()) return false; var user = (from membership in memberships where membership.UserId == rsl.First().UserId select membership).FirstOrDefault();
if (user == null) return false; user.IsConfirmed = true;
dbContext.SaveChanges();
return true;
} public override string CreateAccount(string userName, string password, bool requireConfirmationToken)
{
if (String.IsNullOrEmpty(password))
throw new MembershipCreateUserException(MembershipCreateStatus.InvalidPassword);
string passwordHash = Crypto.HashPassword(password);
if (passwordHash.Length > )
throw new MembershipCreateUserException(MembershipCreateStatus.InvalidPassword); if (String.IsNullOrEmpty(userName))
throw new MembershipCreateUserException(MembershipCreateStatus.InvalidUserName); var user = (from u in userProfiles where u.UserName == userName select u).FirstOrDefault();
if (user == null)
throw new MembershipCreateUserException(MembershipCreateStatus.ProviderError);
if ((from m in memberships where m.UserId == user.UserId select m).Any())
throw new MembershipCreateUserException(MembershipCreateStatus.DuplicateUserName); var token = requireConfirmationToken ? GenerateToken() : null; memberships.Add(new webpages_membership()
{
UserId = user.UserId,
Password = passwordHash,
CreateDate = DateTime.UtcNow,
IsConfirmed = !requireConfirmationToken,
PasswordFailuresSinceLastSuccess = ,
PasswordSalt = string.Empty,
ConfirmationToken = token,
PasswordChangedDate = DateTime.UtcNow
});
try
{
dbContext.SaveChanges();
}
catch (Exception e)
{
throw new MembershipCreateUserException(MembershipCreateStatus.ProviderError);
}
return token;
} private string GenerateToken()
{
using (RNGCryptoServiceProvider provider = new RNGCryptoServiceProvider())
{
var bytes = new byte[];
provider.GetBytes(bytes);
return HttpServerUtility.UrlTokenEncode(bytes);
}
} public override string CreateUserAndAccount(string userName, string password, bool requireConfirmation, IDictionary values)
{
using (TransactionScope ts = new TransactionScope())
{
if ((from u in userProfiles where u.UserName == userName select u).FirstOrDefault() != null)
throw new MembershipCreateUserException(MembershipCreateStatus.DuplicateUserName); userprofile user = new userprofile() { UserName = userName };
userProfiles.Add(user);
dbContext.SaveChanges();
var rsl = CreateAccount(userName, password, requireConfirmation);
ts.Complete();
return rsl;
}
} public override bool DeleteAccount(string userName)
{
var user = (from u in userProfiles where u.UserName == userName select u).FirstOrDefault();
if (user == null) return false; foreach (var membership in from m in memberships where m.UserId == user.UserId select m)
memberships.Remove(membership); dbContext.SaveChanges();
return true;
} public override string GeneratePasswordResetToken(string userName, int tokenExpirationInMinutesFromNow)
{
if (string.IsNullOrEmpty(userName))
throw new ArgumentNullException("userName"); var user = getConfirmedUser(userName);
if (user == null)
throw new InvalidOperationException(); var membership = (from m in memberships
where m.UserId == user.UserId && m.PasswordVerificationTokenExpirationDate > DateTime.UtcNow
select m).FirstOrDefault(); if (membership.PasswordVerificationToken == null)
{
membership.PasswordVerificationToken = GenerateToken();
membership.PasswordVerificationTokenExpirationDate = DateTime.UtcNow.AddMinutes(tokenExpirationInMinutesFromNow);
dbContext.SaveChanges();
}
return membership.PasswordVerificationToken;
} private webpages_membership getConfirmedUser(string userName)
{
var rsl = (from u in userProfiles
join m in memberships on u.UserId equals m.UserId
where m.IsConfirmed == true && u.UserName == userName
select m).FirstOrDefault();
return rsl;
} public override ICollectionGetAccountsForUser(string userName)
{
var rsl = new List(); foreach (var oAuth in from o in oAuthMemberships
join u in userProfiles on o.UserId equals u.UserId
where u.UserName == userName
select o)
{
rsl.Add(new OAuthAccountData(oAuth.Provider, oAuth.ProviderUserId));
} return rsl;
} public override DateTime GetCreateDate(string userName)
{
var membership = (from m in memberships
join u in userProfiles on m.UserId equals u.UserId
where u.UserName == userName
select m).FirstOrDefault();
return membership == null ? DateTime.MinValue : membership.CreateDate.Value;
} public override DateTime GetLastPasswordFailureDate(string userName)
{
var membership = (from m in memberships
join u in userProfiles on m.UserId equals u.UserId
where u.UserName == userName
select m).FirstOrDefault();
return membership == null || membership.LastPasswordFailureDate.HasValue ?
DateTime.MinValue : membership.LastPasswordFailureDate.Value;
} public override DateTime GetPasswordChangedDate(string userName)
{
var membership = (from m in memberships
join u in userProfiles on m.UserId equals u.UserId
where u.UserName == userName
select m).FirstOrDefault();
return membership == null || membership.PasswordChangedDate.HasValue ?
DateTime.MinValue : membership.PasswordChangedDate.Value;
} public override int GetPasswordFailuresSinceLastSuccess(string userName)
{
var membership = (from m in memberships
join u in userProfiles on m.UserId equals u.UserId
where u.UserName == userName
select m).FirstOrDefault();
return membership == null ? - : membership.PasswordFailuresSinceLastSuccess;
} public override int GetUserIdFromPasswordResetToken(string token)
{
var user = (from m in memberships
where m.PasswordVerificationToken == token
select m).FirstOrDefault();
return user == null ? - : user.UserId;
} public override bool IsConfirmed(string userName)
{
if (string.IsNullOrEmpty(userName))
throw new ArgumentNullException("userName"); return getConfirmedUser(userName) != null;
} public override bool ResetPasswordWithToken(string token, string newPassword)
{
if (string.IsNullOrEmpty(newPassword))
throw new ArgumentNullException("newPassword"); var user = (from m in memberships
where m.PasswordVerificationToken == token && m.PasswordVerificationTokenExpirationDate > DateTime.UtcNow
select m).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 string ApplicationName
{
get
{
if (preProvider == null)
throw new NotSupportedException();
return preProvider.ApplicationName;
}
set
{
if (preProvider == null)
throw new NotSupportedException();
preProvider.ApplicationName = value;
}
} public override bool ChangePassword(string username, string oldPassword, string newPassword)
{
if (preProvider == null) throw new NotSupportedException();
return preProvider.ChangePassword(username, oldPassword, newPassword);
} public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer)
{
if (preProvider == null) throw new NotSupportedException();
return preProvider.ChangePasswordQuestionAndAnswer(username, password, newPasswordQuestion, newPasswordAnswer);
} public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion,
string passwordAnswer, bool isApproved, object providerUserKey, out System.Web.Security.MembershipCreateStatus status)
{
if (preProvider == null) throw new NotSupportedException();
return preProvider.CreateUser(username, password, email, passwordQuestion, passwordAnswer, isApproved, providerUserKey, out status);
} public override bool DeleteUser(string username, bool deleteAllRelatedData)
{
if (preProvider != null)
return preProvider.DeleteUser(username, deleteAllRelatedData); foreach (var u in (from u in userProfiles where u.UserName == username select u))
userProfiles.Remove(u); dbContext.SaveChanges();
return true;
} public override bool EnablePasswordReset
{
get { return preProvider != null && preProvider.EnablePasswordReset; }
} public override bool EnablePasswordRetrieval
{
get { return preProvider != null && preProvider.EnablePasswordRetrieval; }
} public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)
{
if (preProvider != null)
return preProvider.FindUsersByEmail(emailToMatch, pageIndex, pageSize, out totalRecords);
else
throw new NotSupportedException();
} public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
{
if (preProvider != null)
return preProvider.FindUsersByName(usernameToMatch, pageIndex, pageSize, out totalRecords);
else
throw new NotSupportedException();
} public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)
{
if (preProvider != null)
return preProvider.GetAllUsers(pageIndex, pageSize, out totalRecords);
else
throw new NotSupportedException();
} public override int GetNumberOfUsersOnline()
{
if (preProvider != null)
return preProvider.GetNumberOfUsersOnline();
else
throw new NotSupportedException();
} public override string GetPassword(string username, string answer)
{
if (preProvider != null)
return preProvider.GetPassword(username, answer);
else
throw new NotSupportedException();
} public override MembershipUser GetUser(string username, bool userIsOnline)
{
if (preProvider != null)
return preProvider.GetUser(username, userIsOnline); var user = (from u in userProfiles
join m in memberships on u.UserId equals m.UserId
where u.UserName == username
select new
{
UserId = u.UserId,
UserName = u.UserName,
CreateDate = m.CreateDate,
PasswordChangeDate = m.PasswordChangedDate
}).FirstOrDefault();
return user == null ? null : new MembershipUser(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, bool userIsOnline)
{
if (preProvider != null)
return preProvider.GetUser(providerUserKey, userIsOnline); throw new NotSupportedException();
} public override string GetUserNameByEmail(string email)
{
if (preProvider == null)
throw new NotSupportedException(); return preProvider.GetUserNameByEmail(email);
} public override int MaxInvalidPasswordAttempts
{
get { return preProvider == null ? int.MaxValue : preProvider.MaxInvalidPasswordAttempts; }
} public override int MinRequiredNonAlphanumericCharacters
{
get { return preProvider == null ? : preProvider.MinRequiredNonAlphanumericCharacters; }
} public override int MinRequiredPasswordLength
{
get { return preProvider == null ? : preProvider.MinRequiredPasswordLength; }
} public override int PasswordAttemptWindow
{
get { return preProvider == null ? int.MaxValue : preProvider.PasswordAttemptWindow; }
} public override MembershipPasswordFormat PasswordFormat
{
get { return preProvider == null ? MembershipPasswordFormat.Hashed : preProvider.PasswordFormat; }
} public override string PasswordStrengthRegularExpression
{
get { return preProvider == null ? string.Empty : preProvider.PasswordStrengthRegularExpression; }
} public override bool RequiresQuestionAndAnswer
{
get { return preProvider != null && preProvider.RequiresQuestionAndAnswer; }
} public override bool RequiresUniqueEmail
{
get { return preProvider != null && preProvider.RequiresUniqueEmail; }
} public override string ResetPassword(string username, string answer)
{
if (preProvider == null)
throw new NotSupportedException(); return preProvider.ResetPassword(username, answer);
} public override bool UnlockUser(string userName)
{
if (preProvider == null)
throw new NotSupportedException(); return preProvider.UnlockUser(userName);
} public override void UpdateUser(MembershipUser user)
{
if (preProvider == null)
throw new NotSupportedException(); preProvider.UpdateUser(user);
} public override bool ValidateUser(string username, string password)
{
if (preProvider != null)
return preProvider.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 = ;
else
{
user.PasswordFailuresSinceLastSuccess += ;
user.LastPasswordFailureDate = DateTime.UtcNow;
}
dbContext.SaveChanges();
return rsl;
} public override bool HasLocalAccount(int userId)
{
return (from m in memberships where m.UserId == userId select m).Any();
} public override void CreateOrUpdateOAuthAccount(string provider, string providerUserId, string userName)
{
if (string.IsNullOrEmpty(userName))
throw new MembershipCreateUserException(MembershipCreateStatus.ProviderError); var user = (from u in userProfiles where u.UserName == userName select u).FirstOrDefault();
if (user == null)
throw new MembershipCreateUserException(MembershipCreateStatus.InvalidUserName); var oAuthUser = (from o in oAuthMemberships where o.Provider == provider.ToUpperInvariant()
&& o.ProviderUserId == providerUserId.ToUpperInvariant() select o).FirstOrDefault();
if (oAuthUser == null)
{
oAuthMemberships.Add(new webpages_oauthmembership()
{
Provider = provider.ToUpperInvariant(),
ProviderUserId = providerUserId.ToUpperInvariant(),
UserId = user.UserId
});
}
else
{
oAuthUser.UserId = user.UserId;
}
dbContext.SaveChanges();
} public override void DeleteOAuthAccount(string provider, string providerUserId)
{
foreach (var oauth in (from o in oAuthMemberships where o.ProviderUserId == providerUserId.ToUpperInvariant()
&& o.Provider == providerUserId.ToUpperInvariant() select o))
oAuthMemberships.Remove(oauth);
dbContext.SaveChanges();
} public override void DeleteOAuthToken(string token)
{
foreach (var t in (from o in dbContext.webpages_oauthtoken where o.Token == token select o))
dbContext.webpages_oauthtoken.Remove(t); dbContext.SaveChanges();
} public override string GetOAuthTokenSecret(string token)
{
var secret = (from o in dbContext.webpages_oauthtoken where o.Token == token select o).FirstOrDefault();
return secret == null ? null : secret.Secret;
} public override string GetUserNameFromId(int userId)
{
var user = (from u in userProfiles where u.UserId == userId select u).FirstOrDefault();
return user == null ? null : user.UserName;
} public override int GetUserIdFromOAuth(string provider, string providerUserId)
{
var user = (from u in oAuthMemberships
where u.Provider == provider.ToUpperInvariant() && u.ProviderUserId == provider.ToUpperInvariant()
select u).FirstOrDefault();
return user == null ? - : user.UserId;
} public override void ReplaceOAuthRequestTokenWithAccessToken(string requestToken, string accessToken, string accessTokenSecret)
{
using (TransactionScope ts = new TransactionScope())
{
foreach (var oauth in (from o in dbContext.webpages_oauthtoken where o.Token == requestToken select o))
dbContext.webpages_oauthtoken.Remove(oauth); dbContext.SaveChanges(); StoreOAuthRequestToken(accessToken, accessTokenSecret);
ts.Complete();
}
} public override void StoreOAuthRequestToken(string requestToken, string requestTokenSecret)
{
var secret = (from oauth in dbContext.webpages_oauthtoken where oauth.Token == requestToken select oauth).FirstOrDefault();
if (secret == null)
{
dbContext.webpages_oauthtoken.Add(new webpages_oauthtoken()
{
Token = requestToken,
Secret = requestTokenSecret
});
}
else
{
secret.Secret = requestTokenSecret;
}
dbContext.SaveChanges();
} }
}

然后是 RoleProvider 的代码。

using System;
using System.Collections.Generic;
using System.Data.Linq.SqlClient;
using System.Globalization;
using System.Linq;
using System.Resources;
using System.Transactions;
using System.Web;
using System.Web.Security; namespace TestSimpleMembership.Help
{
public class MySqlSimpleRoleProvider : RoleProvider
{
private static string Security_NoUserFound = "No user was found that has the name "{}"."; private static string SimpleRoleProvder_UserNotInRole = "User "{}" is not in role "{}".";
private static string SimpleRoleProvder_UserAlreadyInRole = "User "{}" is already in role "{}".";
private static string SimpleRoleProvider_RoleExists = "Role "{}" already exists.";
private static string SimpleRoleProvder_RolePopulated = "The role "{}" cannot be deleted because there are still users in the role.";
private static string SimpleRoleProvider_NoRoleFound = "No role was found that has the name "{}"."; private static string DEFAULT_PROVIDER_NAME = "MySQLRoleProvider";
private static string DEFAULT_NAME = "MySqlSimpleRoleProvider";
private static string DEFAULT_PROVIDER_CONFIG_NAME = "provider"; private RoleProvider preProvider;
private MemberAuthorContext dbContext; public override void Initialize(string name, 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 = Roles.Providers[providerName] ?? Roles.Providers[DEFAULT_PROVIDER_NAME]; this.dbContext = new MemberAuthorContext();
} public override void AddUsersToRoles(string[] usernames, string[] roleNames)
{
if (preProvider != null)
{
preProvider.AddUsersToRoles(usernames, roleNames);
return;
} var users = getUserFromNames(usernames); var roles = getRoleFromNames(roleNames); foreach (var user in users)
{
foreach (var role in roles)
{
if (IsUserInRole(user.UserName, role.RoleName))
throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture,
SimpleRoleProvder_UserAlreadyInRole, new object[] { user.UserName, role.RoleName })); dbContext.webpages_usersinroles.Add(new webpages_usersinroles()
{
UserId = user.UserId,
RoleId = role.RoleId
}); }
}
dbContext.SaveChanges();
} private ListgetRoleFromNames(string[] roleNames)
{
var roles = new List();
foreach (var name in roleNames)
{
var role = (from r in dbContext.webpages_roles where r.RoleName == name select r).FirstOrDefault();
if (role == null)
throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture,
SimpleRoleProvider_NoRoleFound, new object[] { name }));
roles.Add(role);
}
return roles;
} private ListgetUserFromNames(string[] usernames)
{
var users = new List();
foreach (var name in usernames)
{
var user = (from u in dbContext.userprofile where u.UserName == name select u).FirstOrDefault();
if (user == null)
throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture,
Security_NoUserFound, new object[] { name }));
users.Add(user);
}
return users;
} public override string ApplicationName
{
get
{
if (preProvider == null)
throw new NotSupportedException();
return preProvider.ApplicationName;
}
set
{
if (preProvider == null)
throw new NotSupportedException();
preProvider.ApplicationName = value;
}
} public override void CreateRole(string roleName)
{
if (preProvider != null)
{
preProvider.CreateRole(roleName);
return;
} if ((from r in dbContext.webpages_roles where r.RoleName == roleName select r).Any())
throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture,
SimpleRoleProvider_RoleExists, new object[] { roleName })); dbContext.webpages_roles.Add(new webpages_roles() { RoleName = roleName });
dbContext.SaveChanges();
} public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
{
if (preProvider != null)
return preProvider.DeleteRole(roleName, throwOnPopulatedRole); var role = (from r in dbContext.webpages_roles where r.RoleName == roleName select r).FirstOrDefault();
if (role == null)
return false; var uirs = from uir in dbContext.webpages_usersinroles where uir.RoleId == role.RoleId select uir;
if (throwOnPopulatedRole && uirs.Any())
throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture,
SimpleRoleProvder_RolePopulated, new object[] { roleName })); using (TransactionScope ts = new TransactionScope())
{
foreach (var uir in uirs)
dbContext.webpages_usersinroles.Remove(uir);
dbContext.webpages_roles.Remove(role);
dbContext.SaveChanges();
ts.Complete();
}
return true;
} public override string[] FindUsersInRole(string roleName, string usernameToMatch)
{
if (preProvider != null)
return preProvider.FindUsersInRole(roleName, usernameToMatch); return (from u in dbContext.userprofile
join uir in dbContext.webpages_usersinroles on u.UserId equals uir.UserId
join r in dbContext.webpages_roles on uir.RoleId equals r.RoleId
where r.RoleName == roleName && SqlMethods.Like(u.UserName, usernameToMatch)
select u.UserName).ToArray();
} public override string[] GetAllRoles()
{
if (preProvider != null)
return preProvider.GetAllRoles(); return (from r in dbContext.webpages_roles select r.RoleName).ToArray();
} public override string[] GetRolesForUser(string username)
{
if (preProvider != null)
return preProvider.GetRolesForUser(username); return (from r in dbContext.webpages_roles
join uir in dbContext.webpages_usersinroles on r.RoleId equals uir.RoleId
join u in dbContext.userprofile on uir.UserId equals u.UserId
where u.UserName == username
select r.RoleName).Distinct().ToArray();
} public override string[] GetUsersInRole(string roleName)
{
if (preProvider != null)
return preProvider.GetUsersInRole(roleName); return (from u in dbContext.userprofile
join uir in dbContext.webpages_usersinroles on u.UserId equals uir.UserId
join r in dbContext.webpages_roles on uir.RoleId equals r.RoleId
where r.RoleName == roleName
select u.UserName).ToArray();
} public override bool IsUserInRole(string username, string roleName)
{
if (preProvider != null)
return preProvider.IsUserInRole(username, roleName); return (from u in dbContext.userprofile
join uir in dbContext.webpages_usersinroles on u.UserId equals uir.UserId
join r in dbContext.webpages_roles on uir.RoleId equals r.RoleId
where u.UserName == username && r.RoleName == roleName
select u).Any();
} public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
{
if (preProvider != null)
{
preProvider.RemoveUsersFromRoles(usernames, roleNames);
return;
} foreach (var name in roleNames)
{
if (!RoleExists(name))
throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture,
SimpleRoleProvider_NoRoleFound, new object[] { name }));
} foreach (var user in usernames)
{
foreach (var role in roleNames)
{
if (!IsUserInRole(user, role))
throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture,
SimpleRoleProvder_UserNotInRole, new object[] { user, role }));
}
} var users = getUserFromNames(usernames);
var roles = getRoleFromNames(roleNames); foreach (var user in users)
{
foreach (var role in roles)
{
dbContext.webpages_usersinroles.Remove((from uir in dbContext.webpages_usersinroles
where uir.RoleId == role.RoleId && uir.UserId == user.UserId
select uir).FirstOrDefault());
}
}
dbContext.SaveChanges();
} public override bool RoleExists(string roleName)
{
if (preProvider != null)
return preProvider.RoleExists(roleName); return (from r in dbContext.webpages_roles where r.RoleName == roleName select r).Any();
} }
}

以上代码可以看出,如果你指定了原来的 Membership 系统的 Provider 的话,其实两个认证系统是可以整合在一起的。

SimpleMembershipProvider 的 MySql 实现的更多相关文章

  1. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  2. mysql每秒最多能插入多少条数据 ? 死磕性能压测

    前段时间搞优化,最后瓶颈发现都在数据库单点上. 问DBA,给我的写入答案是在1W(机械硬盘)左右. 联想起前几天infoQ上一篇文章说他们最好的硬件写入速度在2W后也无法提高(SSD硬盘) 但这东西感 ...

  3. LINUX篇,设置MYSQL远程访问实用版

    每次设置root和远程访问都容易出现问题, 总结了个通用方法, 关键在于实用 step1: # mysql -u root mysql mysql> Grant all privileges o ...

  4. nodejs进阶(6)—连接MySQL数据库

    1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...

  5. MySQL高级知识- MySQL的架构介绍

    [TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...

  6. 闰秒导致MySQL服务器的CPU sys过高

    今天,有个哥们碰到一个问题,他有一个从库,只要是启动MySQL,CPU使用率就非常高,其中sys占比也比较高,具体可见下图. 注意:他的生产环境是物理机,单个CPU,4个Core. 于是,他抓取了CP ...

  7. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  8. Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制

    将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现.SQ ...

  9. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

随机推荐

  1. Erlang 日期和时间处理、时间戳转换

    http://www.csdn 123.com/html/blogs/20131113/95993.htm 获取当前时间 erlang:now()得到的是从1970年1月1日零时起,到现在经过的时间, ...

  2. 【a601】雇佣计划

    Time Limit: 1 second Memory Limit: 32 MB [问题描述] 一位管理项目的经理想要确定每个月需要的工人,他知道每月所需的最少工人数.当他雇佣或解雇一个工人时,会有一 ...

  3. HDU 5317 RGCDQ(素数个数 多校2015啊)

    题目链接:pid=5317" target="_blank">http://acm.hdu.edu.cn/showproblem.php?pid=5317 Prob ...

  4. 关系型数据库工作原理-快速缓存(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...

  5. XMPP之ios即时通讯客户端开发-配置XMPP基本信息之工程代码(五)

    登录功能完成以后包含以下代码文件: AppDelegate.h AppDelegate.m LoginViewController.h LoginViewController.m LoginUser. ...

  6. Spring Boot 定制与优化内置的Tomcat容器

    1.Spring Boot定制与优化内置Tomcat容器. > 内置的容器有三个分别是Undertow.Jetty.Tomcat,Spring Boot 对这三个容器分别进行了实现,它们上层接口 ...

  7. Swift下CoreData的使用

    我之前的随笔中有写过一些iOS持久化存储的方法,包含了sqlite.解归档.沙盒存放等等.这些方式中,能够大规模存储,并保持性能的只有使用sqlite了.而这里将记录下Cocoa自身继承的数据库的存储 ...

  8. 保护SSD,设置Chrome浏览器临时文件夹到ramdisk分区

    很多用低端/山寨SSD的朋友都用Ramdisk来保护硬盘,一般都把系统temp目录和IE浏览器临时文件夹目录设到Ramdisk分区了.      最近用谷歌的chrome浏览器,发现浏览网页时候硬盘灯 ...

  9. Entity Framework知识小总结

    什么是Entity Framework EF是微软主推的数据存取技术,在实际开发中,现在通常使用EF来构建应用程序的数据存取层,它是一个开源的“对象/关系映射(ORM:Object Relationa ...

  10. 国产操作系统剽窃Linux内核可耻!

    10月28日,新浪科技发表文章,题为"国产操作系统迎来利好:部委机构正大量採购",读后有感. 如今,国家进入法制时代.政府採购"国产操作系统",似乎成为一种&q ...