2011-04-05 130 views
2

我嘗試實現自定義MembershipPriver使用自定義中的MembershipUser我自己的數據庫(一個具體的用戶表型號):實現自定義和的MembershipUser自定義的MembershipProvider

這是LY diffent文件:

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

<?xml version="1.0"?> 

<!-- 
    For more information on how to configure your ASP.NET application, please visit 
    http://go.microsoft.com/fwlink/?LinkId=152368 
    --> 

<configuration> 
    <connectionStrings> 
    <add name="iTwitterDB" connectionString="metadata=res://*/Models.iTwitter.csdl|res://*/Models.iTwitter.ssdl|res://*/Models.iTwitter.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\iTwitter.mdf;Integrated Security=True;User Instance=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /></connectionStrings> 

    <system.web> 
    <compilation debug="true" targetFramework="4.0"> 
     <assemblies> 
     <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
     <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
     <add assembly="System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
     <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /></assemblies> 
    </compilation> 

    <authentication mode="Forms"> 
     <forms loginUrl="~/Account/LogOn" timeout="2880" /> 
    </authentication> 

    <membership defaultProvider="CustomMembershipProvider"> 
     <providers> 
     <clear /> 
     <add name="CustomMembershipProvider" type="iTwitterMembershipProvider" connectionStringName="iTwitterDB" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" /> 
     </providers> 
    </membership> 

    <profile> 
     <providers> 
     <clear /> 
     <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="iTwitterDB" applicationName="/" /> 
     </providers> 
    </profile> 

    <roleManager enabled="false"> 
     <providers> 
     <clear /> 
     <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="iTwitterDB" applicationName="/" /> 
     <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" /> 
     </providers> 
    </roleManager> 

    <pages> 
     <namespaces> 
     <add namespace="System.Web.Mvc" /> 
     <add namespace="System.Web.Mvc.Ajax" /> 
     <add namespace="System.Web.Mvc.Html" /> 
     <add namespace="System.Web.Routing" /> 
     </namespaces> 
    </pages> 
    </system.web> 

    <system.webServer> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <modules runAllManagedModulesForAllRequests="true" /> 
    </system.webServer> 

    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" /> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
</configuration> 

iTwitterDB:

1) 'iTwitterMembershipProvider' does not implement inherited abstract 

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; 
       } 
      } 
     } 
    } 
} 

我編譯時已經有些錯誤

構件 'System.Web.MembershiProvider.CreateUser(字符串,字符串 ,字符串,字符串,字符串,布爾, 對象out System.Web.Security.MembershipCreateStatus)'

2) iTwitterMembershipProvider.CreateUser(string, 

串,串,字符串,字符串,布爾, 對象out System.Web.Security.MembershipCreateStatus) ': 發現重寫

3)'iTwitterMembershipProvider.GetUser(string, 

布爾沒有合適的方法)':換貨政... RN類型必須是 'System.Web.Security.MembershipUser' 匹配重寫的成員 'System.Web.Security.MembershipProvider.GetUser(字符串, 布爾)'

我在這裏封鎖。

謝謝。

回答

3

將CreateUser和GetUser的返回類型更改爲基類MembershipUser。當你調用這些方法時,你可以將它轉換爲iTwitterMembershipUser類型。例如,在CREATEUSER更改return語句

return (iTwitterMembershipUser) GetUser(login); 
0

它一直以來我看着的MembershipProvider東西很長一段時間,我不記得所有的接口。但是你的錯誤在於你正在實現一個抽象基類,它有你沒有實現的抽象方法。如果您實現了一個接口,或者從具有抽象方法的類繼承,那麼您的類必須提供這些成員的實現。在你的情況下,你的返回類型與抽象方法的返回類型不匹配。