【问题标题】:Custom MembershipProvider without MembershipUser没有 MembershipUser 的自定义 MembershipProvider
【发布时间】:2011-09-01 19:23:08
【问题描述】:

是否可以在不使用 MembershipUser 类的情况下创建自定义 MembershipProvider?

我想使用我自己的 User 类并保持整洁,我不想使用 MembershipUser 类,它有很多我真的不想要或不需要的属性。

【问题讨论】:

    标签: .net asp.net custom-membershipprovider


    【解决方案1】:

    不,不是。但是您始终可以使用Repository 模式或类似模式在其之上编写自己的抽象,然后在应用程序中使用您自己的User 模型。

    public UserRepository : IUserRepository
    {
       private MembershipProvider provider;
       private UserAdapter userAdapter;
    
       public UserService(MembershipProvider provider, UserAdapter userAdapter)
       {
           this.provider = provider;
           this.userAdapter = userAdapter;
       }
    
       public MyUser GetUser(string email)
       {
           MembershipUser user = provider.GetUser(username, false);
           MyUser myUser= userAdapter.Map(user);
           return myUser;
       }
    }
    

    【讨论】:

    • 感谢您的示例。虽然我决定不使用 ASP.NET 成员资格结构,但您回答了我的问题“是否可以在不使用 MembershipUser 类的情况下创建自定义 MembershipProvider?”
    • @JohanVauhkonen 遇到了同样的问题,我认为最简单的解决方案是创建我们自己的系统。您可以轻松地重现会员提供者的行为,但需要做一些工作。
    【解决方案2】:

    如果您真的想在 ASP.NET Membership 基础结构中内置您的提供程序,您应该这样做。

    Membership.Provider 返回抽象 MembershipProvider 还包含:

    public abstract MembershipUser CreateUser(..);
    public abstract MembershipUser GetUser(..);
    

    和其他返回MembershipUser类的方法。

    【讨论】:

    • 谢谢你,我已经知道如何实现抽象的 MembershipProvider。我有兴趣学习的是是否可以省略 MembershipUser 并将其他东西与 Membership 基础设施一起使用。显然不是。
    【解决方案3】:

    根据您的使用情况,您可以在不使用/继承会员用户的情况下创建自定义会员资格提供程序。如果您没有使用内置的 createuser 方法(用户是在另一个源系统中创建的),那么您真的不需要成员资格用户对象。否则,只需使用您的额外属性创建另一个继承自 membersuser 的对象。

    【讨论】:

    • 您是指会员用户?我是说不要继承会员用户而不是提供者。我明白我的措辞可能有点令人困惑。我的意思是使用自定义会员提供程序,但如果您不需要,请不要真正使用会员用户对象。
    【解决方案4】:

    这是我的解决方案

    customerUser.cs

    public class DZMembership
    {
        public virtual Guid Id { get; set; }
        public virtual string UserName { get; set; }
        public virtual string Password { get; set; }
        public virtual DateTime TimeCreated { get; set; }
    
    }
    

    customerProvider.cs

     public class DZMembershipProvider : MembershipProvider
    {
    
        IDALMembership dal = DalFactory.GetDalMembership();
        #region override of membership provider
        public override string ApplicationName
        {
            get
            {
                throw new NotImplementedException();
            }
            set
            {
                throw new NotImplementedException();
            }
        }
    
        public override bool ChangePassword(string username, string oldPassword, string newPassword)
        {
            DZMembership member = dal.GetMemberByName(username);
            string encryptedOldPsw =  FormsAuthentication.HashPasswordForStoringInConfigFile(oldPassword, "MD5");
            string encryptedNewPsw = FormsAuthentication.HashPasswordForStoringInConfigFile(newPassword, "MD5");
            if (member.Password != encryptedOldPsw) return false;
            member.Password = encryptedNewPsw;
            dal.ChangePassword(member);
            return true;
        }
    public override MembershipUser GetUser(string username, bool userIsOnline)
        {
    
            DZMembership user = dal.GetMemberByName(username);
            if (user == null) return null;
            MembershipUser mu = new MembershipUser("DZMembershipProvider",
                 username, user.Id, "", "", string.Empty,
                 true, true, DateTime.Now,
                 DateTime.Now, DateTime.Now, DateTime.Now, DateTime.Now);
            return mu;
    
        }
    

    当方法需要返回 MembershipUser 类型时,使用您的客户用户信息构建一个新类型。在大多数情况下,它会没事的。因为内置的 Controls(login, loginstatus.) 不需要更多。但我建议通过继承 MembershipUser 来定制你自己的用户,额外的属性不会咬你,但缺乏会。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-06
      • 2010-10-12
      • 1970-01-01
      • 2010-10-29
      • 1970-01-01
      • 2011-08-14
      • 1970-01-01
      相关资源
      最近更新 更多