Реализация пользовательского членства - PullRequest
10 голосов
/ 26 мая 2009

Я хожу по кругу и мне нужна помощь в реализации Custom MembershipUser, чтобы я мог добавить свои собственные пользовательские свойства в MembershipUser.

Я следую примеру на этом сайте: Как: реализовать пользовательское членство

Проблема, с которой я столкнулся, заключается в конструкторе CustomMembershipUser, я думаю.

Мой пользователь CustomMembership имеет эти три дополнительных свойства: 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 имеет значение null, как и другие значения.

Как получить добавленные мной свойства?

Спасибо

Ответы [ 3 ]

12 голосов
/ 26 мая 2009

Основываясь на своем собственном опыте, пытаясь сделать то же самое, попытка использовать для этого MembershipProvider будет крайне разочаровывающим и нелогичным опытом.

Идея модели провайдера членства состоит не в том, чтобы изменить или дополнить определение пользователя, как вы пытаетесь это сделать, а в том, чтобы дать Framework возможность альтернативного способа доступа к уже существующей информации определяется как принадлежащий «MembershipUser».

Я думаю, что вы действительно ищете профиль пользователя. Использование профилей ASP.NET намного проще, чем реализация собственного провайдера. Обзор можно найти здесь .

11 голосов
/ 26 мая 2009

Это работает для меня:

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
3 голосов
/ 26 мая 2009

Просто чтобы вы знали, я пытался пойти по пути MembershipProvider и раньше, и он длинный и ветреный. Вы можете увидеть, удовлетворят ли ваши потребности только создание классов, реализующих IPrincipal и IIdentity, поскольку они влекут за собой гораздо меньше затрат.

...