不使用MembershipUser的自定义MembershipProvider

3

是否可以创建自定义MembershipProvider而不使用MembershipUser类?

我想使用自己的用户类,并且为了保持整洁,我不想使用MembershipUser类,因为它有很多我真的不需要的属性。

4个回答

4

不是的。但您可以使用“存储库”模式或类似方法在其上编写自己的抽象,并在应用程序中使用自己的“用户”模型。

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成员结构,但你回答了我的问题:“是否可以创建一个自定义MembershipProvider而不使用MembershipUser类?” - Johan Alkstål
@JohanVauhkonen 遇到了同样的问题,我认为最简单的解决方案是创建我们自己的系统。你可以轻松地复制会员提供程序的行为,但需要一些工作。 - Rushino

1
如果你真的想在ASP.NET Membership基础设施中内置你的提供程序,那么你应该这样做。 Membership.Provider 返回抽象的MembershipProvider,其中还包含:
public abstract MembershipUser CreateUser(..);
public abstract MembershipUser GetUser(..);

以及其他返回MembershipUser类的方法。


谢谢,我已经知道了实现抽象MembershipProvider的方法。我想学习的是是否可以省略MembershipUser并使用其他东西与Membership基础设施一起使用。显然不行。 - Johan Alkstål

0

这是我的解决方案

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类型时,请使用客户用户信息构建一个新的MembershipUser对象。在大多数情况下,这样做是可以的,因为内置控件(如登录、登录状态)不需要更多信息。但我建议通过继承MembershipUser来自定义您自己的用户,这样可以避免缺少属性的问题。额外的属性不会对您造成任何影响,但缺少属性可能会带来麻烦。

0

如果您的使用情况不需要使用/继承成员资格用户,那么可以创建自定义成员资格提供程序。如果您没有使用内置的createuser方法(用户在另一个源系统中创建),那么您实际上不需要成员资格用户对象。否则,只需创建另一个从membershipuser继承的对象,并添加您需要的额外属性即可。


你是指Membership User吗?我是说不要继承Membership user而不是provider。我知道我的措辞可能有点令人困惑。我的意思是使用自定义的Membership provider,但如果不必要,不要真正使用Membership user对象。 - Alex J

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接