实现Custom MembershipUser和Custom MembershipProvider

我尝试在我自己的数据库中使用Custom MemberShipUser实现Custom MembershipPriver(具有特定的用户表模型):

这是不同的文件:

iTwitterMembershipProvider.cs

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Security; using System.Collections.Specialized; using iTwitter.Models; public class iTwitterMembershipProvider : MembershipProvider { public override string ApplicationName { get { return _ApplicationName; } set { _ApplicationName = value; } } public override bool ChangePassword(string username, string oldPassword, string newPassword) { throw new NotImplementedException(); } public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer) { return false; } public override iTwitterMembershipUser CreateUser(string login, string password, string email, string tokenKey, string tokenSecret, string twitterUserId, object providerUserKey, out MembershipCreateStatus status) { ValidatePasswordEventArgs args = new ValidatePasswordEventArgs(login, password, true); OnValidatingPassword(args); if (args.Cancel) { status = MembershipCreateStatus.InvalidPassword; return null; } if (RequiresUniqueEmail && GetUserNameByEmail(email) != "") { status = MembershipCreateStatus.DuplicateEmail; return null; } iTwitterMembershipUser u = GetUser(login, false); if (u == null) { UserRepository _user = new UserRepository(); _user.CreateUser(login, password, email); status = MembershipCreateStatus.Success; return GetUser(login, false); } else { status = MembershipCreateStatus.DuplicateUserName; } return null; } public override bool DeleteUser(string username, bool deleteAllRelatedData) { throw new NotImplementedException(); } public override bool EnablePasswordReset { get { return _EnablePasswordReset; } } public override bool EnablePasswordRetrieval { get { return _EnablePasswordRetrieval; } } public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords) { throw new NotImplementedException(); } public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords) { throw new NotImplementedException(); } public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords) { throw new NotImplementedException(); } public override int GetNumberOfUsersOnline() { throw new NotImplementedException(); } public override string GetPassword(string username, string answer) { throw new NotImplementedException(); } public override iTwitterMembershipUser GetUser(string login, bool userIsOnline) { UserRepository _user = new UserRepository(); return _user.GetUser(login); } public override MembershipUser GetUser(object providerUserKey, bool userIsOnline) { throw new NotImplementedException(); } public override string GetUserNameByEmail(string email) { UserRepository _user = new UserRepository(); return _user.GetUserNameByEmail(email); } public override int MaxInvalidPasswordAttempts { get { return _MaxInvalidPasswordAttempts; } } public override int MinRequiredNonAlphanumericCharacters { get { return _MinRequiredNonalphanumericCharacters; } } public override int MinRequiredPasswordLength { get { return _MinRequiredPasswordLength; } } public override int PasswordAttemptWindow { get { return _PasswordAttemptWindow; } } public override MembershipPasswordFormat PasswordFormat { get { return _PasswordFormat; } } public override string PasswordStrengthRegularExpression { get { return _PasswordStrengthRegularExpression; } } public override bool RequiresQuestionAndAnswer { get { return _RequiresQuestionAndAnswer; } } public override bool RequiresUniqueEmail { get { return _RequiresUniqueEmail; } } public override string ResetPassword(string username, string answer) { throw new NotImplementedException(); } public override bool UnlockUser(string userName) { throw new NotImplementedException(); } public override void UpdateUser(MembershipUser user) { throw new NotImplementedException(); } public override bool ValidateUser(string login, string password) { if (login == password) { return true; } else { return false; } } // // A helper function to retrieve config values from the configuration file. // private string GetConfigValue(string configValue, string defaultValue) { if (string.IsNullOrEmpty(configValue)) return defaultValue; return configValue; } // // Properties from web.config, default all to False // private string _ApplicationName; private bool _EnablePasswordReset; private bool _EnablePasswordRetrieval = false; private bool _RequiresQuestionAndAnswer = false; private bool _RequiresUniqueEmail = true; private int _MaxInvalidPasswordAttempts; private int _PasswordAttemptWindow; private int _MinRequiredPasswordLength; private int _MinRequiredNonalphanumericCharacters; private string _PasswordStrengthRegularExpression; private MembershipPasswordFormat _PasswordFormat = MembershipPasswordFormat.Hashed; public override void Initialize(string name, NameValueCollection config) { if (config == null) throw new ArgumentNullException("config"); if (name == null || name.Length == 0) name = "CustomMembershipProvider"; if (String.IsNullOrEmpty(config["description"])) { config.Remove("description"); config.Add("description", "Custom Membership Provider"); } base.Initialize(name, config); _ApplicationName = GetConfigValue(config["applicationName"], System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath); _MaxInvalidPasswordAttempts = Convert.ToInt32( GetConfigValue(config["maxInvalidPasswordAttempts"], "5")); _PasswordAttemptWindow = Convert.ToInt32( GetConfigValue(config["passwordAttemptWindow"], "10")); _MinRequiredNonalphanumericCharacters = Convert.ToInt32( GetConfigValue(config["minRequiredNonalphanumericCharacters"], "1")); _MinRequiredPasswordLength = Convert.ToInt32( GetConfigValue(config["minRequiredPasswordLength"], "6")); _EnablePasswordReset = Convert.ToBoolean( GetConfigValue(config["enablePasswordReset"], "true")); _PasswordStrengthRegularExpression = Convert.ToString( GetConfigValue(config["passwordStrengthRegularExpression"], "")); } } 

iTwitterMembershipUser.cs

 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Security; using iTwitter.Models; namespace iTwitter.Models { public class iTwitterMembershipUser : MembershipUser { private string _tokenKey; private string _tokenSecret; private string _twitterUserId; private string _login; private string _email; private int _providerUserKey; public string tokenKey { get { return _tokenKey; } set { _tokenKey = value; } } public string tokenSecret { get { return _tokenSecret; } set { _tokenSecret = value; } } public string twitterUserId { get { return _twitterUserId; } set { _twitterUserId = value; } } public string login { get { return _login; } set { _login = value; } } public string email { get { return _email; } set { _email = value; } } public int providerUserKey { get { return _providerUserKey; } set { _providerUserKey = value; } } public iTwitterMembershipUser(object providername, string login, int providerUserKey, string email, string tokenKey, string tokenSecret, string twitterUserId) { this.tokenKey = tokenKey; this.tokenSecret = tokenSecret; this.twitterUserId = twitterUserId; this.login = login; this.providerUserKey = providerUserKey; this.email = email; } } } 

webconfig.cs

                                                          

iTwitterDB:

 id int login varchar(50) password varchar(100) (MD5 Password Hash) email varchar(100) tokenKey varchar(100) tokenSecret varchar(100) twitterUserId varchar(100) 

UserRepository.cs

 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Security; namespace iTwitter.Models { public class UserRepository { public iTwitterMembershipUser CreateUser(string login, string password, string email) { using (iTwitterDB db = new iTwitterDB()) { Users user = new Users(); user.login = login; user.email = email; user.password = password; user.tokenKey = "0"; user.tokenSecret = "0"; user.twitterUserId = "0"; db.AddToUsers(user); db.SaveChanges(); return GetUser(login); } } public string GetUserNameByEmail(string email) { using (iTwitterDB db = new iTwitterDB()) { var result = from u in db.Users where (u.email == email) select u; if (result.Count() != 0) { var dbuser = result.FirstOrDefault(); return dbuser.login; } else { return ""; } } } public iTwitterMembershipUser GetUser(string login) { using (iTwitterDB db = new iTwitterDB()) { var result = from u in db.Users where (u.login == login) select u; if (result.Count() != 0) { var dbuser = result.FirstOrDefault(); string _login = dbuser.login; int _providerUserKey = dbuser.id; string _email = dbuser.email; string _tokenKey = dbuser.tokenKey; string _tokenSecret = dbuser.tokenSecret; string _twitterUserId = dbuser.twitterUserId; iTwitterMembershipUser user = new iTwitterMembershipUser("CustomMembershipProvider", _login, _providerUserKey, _email, _tokenKey, _tokenSecret, _twitterUserId); return user; } else { return null; } } } } } 

我在编译期间遇到了一些错误:

 1) 'iTwitterMembershipProvider' does not implement inherited abstract 

member’System.Web.MembershiProvider.CreateUser(string,string,string,string,string,bool,object,out System.Web.Security.MembershipCreateStatus)’

 2) iTwitterMembershipProvider.CreateUser(string, 

string,string,string,string,bool,object,out System.Web.Security.MembershipCreateStatus)’:找不到合适的方法来覆盖

 3)'iTwitterMembershipProvider.GetUser(string, 

‘bool)’:返回类型必须是’System.Web.Security.MembershipUser’才能匹配被覆盖的成员’System.Web.Security.MembershipProvider.GetUser(string,bool)’

我在这里被封锁了。

谢谢。

将CreateUser和GetUser的返回类型更改为基类MembershipUser。 当您调用这些方法时,您可以将其强制转换为iTwitterMembershipUser类型。 例如,在CreateUser中,将return语句更改为

 return (iTwitterMembershipUser) GetUser(login); 

自从我查看MembershipProvider的内容已经有很长一段时间了,我不记得所有接口了。 但是你的错误是关于你正在实现一个抽象基类的事实,它具有你没有实现的抽象方法。 如果实现接口,或者使用抽象方法从类inheritance,那么您的类必须提供这些成员的实现。 在您的情况下,返回类型与抽象方法的返回类型不匹配。