2

私は自分のデータベースでカスタム MemberShipUser を使用してカスタム 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

<?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 :

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

メンバー '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.MembershipProvider.GetUser(string, bool)' と一致する 'System.Web.Security.MembershipUser' である必要があります

私はここでブロックされています。

ありがとうございました。

4

2 に答える 2

3

CreateUser と GetUser の戻り値の型を基本クラス MembershipUser に変更します。これらのメソッドを呼び出すと、iTwitterMembershipUser 型にキャストできます。たとえば、CreateUser では、return ステートメントを次のように変更します。

return (iTwitterMembershipUser) GetUser(login);
于 2011-04-05T17:46:48.973 に答える
0

MembershipProvider を調べてから長い時間が経ちましたが、すべてのインターフェイスを覚えているわけではありません。しかし、あなたのエラーは、実装していない抽象メソッドを持つ抽象基本クラスを実装しているという事実に関するものです。インターフェイスを実装するか、抽象メソッドを持つクラスから継承する場合、クラスはそれらのメンバーの実装を提供する必要があります。あなたの場合、戻り値の型が抽象メソッドの戻り値の型と一致しません。

于 2011-04-05T17:47:17.100 に答える