【问题标题】:Implementing Custom MembershipUser实现自定义 MembershipUser
【发布时间】:2010-10-29 01:37:05
【问题描述】:

我正在兜圈子,需要一些帮助来实现自定义 MembershipUser,以便我可以将自己的自定义属性添加到 MembershipUser。

我一直在关注这个网站上的例子:How to: Implement a Custom Membership User

我认为我遇到的问题出在 CustomMembershipUser 的构造函数中。

我的 CustomMembershipUser 具有以下三个附加属性:firstName、middleName、lastName。

public class CustomMembershipProvider : MembershipProvider
{
  public override MembershipUser GetUser(string username, bool userIsOnline)
    {
       //.... Get data from database
       MembershipUser baseUser = new MembershipUser(this.Name,
                                               username,
                                               userId,
                                               email,
                                               "",
                                               comment,
                                               isApproved,
                                               isLockedOut,
                                               dtCreate,
                                               dtLastLogin,
                                               dtLastActivity,
                                               DateTime.Now,
                                               dtLastLockoutDate);
                    return new CustomMembershipUser(baseUser, firstName, middleName, lastName)
    }
}


public class CustomMembershipUser : MembershipUser
{
  private string _firstName;
    public string FirstName { get { return _firstName; } set { _firstName = value; } }

    private string _middleName;
    public string MiddleName { get { return _middleName; } set { _middleName = value; } }

    private string _lastName;
    public string LastName { get { return _lastName; } set { _lastName = value; } }

 public CustomMembershipUser(MembershipUser baseuser, string firstname, string middlename, string lastname)
    {
        _firstName = firstname;
        _middleName = middlename;
        _lastName = lastname;

        new CustomMembershipUser(baseuser); // DO I NEED THIS?? HOW TO IMPLEMENT??
        
    }
}

我这样称呼它:

    MembershipUser mu = Membership.GetUser(UserName);

    CustomMembershipProvider p = (CustomMembershipProvider)Membership.Provider;
    
    MembershipUser memUser = p.GetUser(UserName, true);

    object userId = memUser.ProviderUserKey;

ProviderUserKey 为空,其他值也是如此。

如何获取我添加的附加属性?

谢谢

【问题讨论】:

    标签: asp.net membership


    【解决方案1】:

    这对我有用:

    public class CustomMembershipUser : MembershipUser
    {
        public CustomMembershipUser(
            string providerName,
            string name,
            object providerUserKey,
            string email,
            string passwordQuestion,
            string comment,
            bool isApproved,
            bool isLockedOut,
            DateTime creationDate,
            DateTime lastLoginDate,
            DateTime lastActivityDate,
            DateTime lastPasswordChangedDate,
            DateTime lastLockoutDate
            )
            : base(providerName, name, providerUserKey, email, passwordQuestion,
            comment, isApproved, isLockedOut, creationDate, lastLoginDate,
            lastActivityDate, lastPasswordChangedDate, lastLockoutDate)
        {
        }
    
        // Add additional properties
        public string CustomerNumber { get; set; }
    
    }
    
    public class CustomMembershipProvider : MembershipProvider
    {
    
        public override MembershipUser GetUser(string username, bool userIsOnline)
        {
            if (string.IsNullOrEmpty(username))
            {
                // No user signed in
                return null;
            }
    
            // ...get data from db
    
            CustomMembershipUser user = new CustomMembershipUser(
                        "CustomMembershipProvider",
                        db.Username,
                        db.UserId,
                        db.Email,
                        "",
                        "",
                        true,
                        false,
                        db.CreatedAt,
                        DateTime.MinValue,
                        DateTime.MinValue,
                        DateTime.MinValue,
                        DateTime.MinValue);
    
            // Fill additional properties
            user.CustomerNumber = db.CustomerNumber;
    
            return user;
    
        }
    
    }
    
    // Get custom user (if allready logged in)
    CustomMembershipUser user = Membership.GetUser(true) as CustomMembershipUser;
    
    // Access custom property
    user.CustomerNumber
    

    【讨论】:

    • 吉米,谢谢!!您的示例使事情变得更加清晰,现在我的实施正在发挥作用。您能否发布您的 CustomMembership 的构造函数的代码?感谢其他为使用个人资料提供指导并分享您的经验的人。
    • Picflight,我不太确定“CustomMembership 的构造函数”是什么意思。我的 CustomerMembershipProvider 类没有构造函数。
    • 我想向其他发现此问题的人指出,即使这是“已接受”的答案,这不是完成此任务的正确方法任务 - 属于用户的任何其他属性都应存储在配置文件中,这样您就可以更轻松地完成此任务,并且不会像此处显示的代码那样破坏模型。有关更多信息,请参阅下面的答案。
    • Daniel,我可能在这里弄错了,但我认为如果您已经在某个自定义表中拥有用户,我的解决方案是正确的。如果您没有任何用户,那么您可能不需要首先实现自定义提供程序,并且 Profile 将是存储额外用户信息的便捷方法。如果底层自定义用户表发生变化,您将如何同步配置文件?
    • 如果他还在编写会员提供程序的阶段,那会让我相信还没有任何数据。无论如何,使用已经可用的工具,即使这意味着要花一点时间进行前期重构,最终也会节省时间并使代码更易于维护。使用配置文件,如果您使用默认配置文件,则无需在每次添加属性时更改数据库。使用此解决方案,如果添加属性,则需要更改数据库和成员资格提供程序,需要重新编译。使用配置文件,这只是配置更改。
    【解决方案2】:

    您知道,我之前尝试过使用 MembershipProvider 路径,但这条路径又长又多风。您可能会发现仅创建实现 IPrincipal 和 IIdentity 的类是否能满足您的需求,因为它们需要的开销要少得多。

    【讨论】:

      【解决方案3】:

      根据我自己尝试做很多相同的经验,尝试使用 MembershipProvider 来做这件事最终将是一种令人沮丧和违反直觉的体验。

      会员提供者模型的想法不是改变或增加用户的定义,正如您正在尝试做的那样 - 它是允许框架以替代方式访问已经存在的信息定义为属于“MembershipUser”。

      我认为您真正需要的是用户个人资料。使用 ASP.NET 配置文件比实现您自己的提供程序更容易。 You can find the overview here.

      【讨论】:

      • +1 概览。此外,您可能想查看下面的 OdeToCode 文章。它提供了一个示例,说明如何以类似于您所描述的方式使用 Profile 类。 odetocode.com/articles/440.aspx
      • 我正在使用配置文件提供程序将名字和姓氏与会员用户相关联。它有一些令人讨厌的特征,但总的来说,它是一种将个人资料功能集成到使用会员资格的应用中的快速方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      • 2014-02-01
      • 2014-10-14
      • 2011-06-04
      相关资源
      最近更新 更多