当前位置: 动力学知识库 > 问答 > 编程问答 >

asp.net - Implementing Custom MembershipUser

问题描述:

I am going round in circles and need some help in implementing a Custom MembershipUser so that I can add my own custom Properties to the MembershipUser.

I have been following the example on this site: How to: Implement a Custom Membership User

The problem I am having is in the constructor of CustomMembershipUser, I think.

My CustomMembershipUser has these three additional Properties: 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??

}

}

I am calling it like so:

 MembershipUser mu = Membership.GetUser(UserName);

CustomMembershipProvider p = (CustomMembershipProvider)Membership.Provider;

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

object userId = memUser.ProviderUserKey;

The ProviderUserKey is null and so are the other values.

How can I obtain the addition Properties I added?

Thanks

网友答案:

This is working for me:

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
网友答案:

Based on my own experience trying to do much of the same, trying to use the MembershipProvider to do this will be an ultimately frustrating and counterintuitive experience.

The idea of the membership provider model isn't to change or augment what the definition of a user is, as you're trying to do - it is to allow the Framework an alternate means of accessing the information that has already been defined as belonging to a "MembershipUser".

I think what you're really looking for is a user profile. Using ASP.NET profiles is boatloads easier than implementing your own provider. You can find the overview here.

网友答案:

Just so you know, I've tried to go down the MembershipProvider path before, and it's a long and windy one. You might see if just creating classes that implement IPrincipal and IIdentity will satisfy your needs, since they entail a lot less overhead.

分享给朋友:
您可能感兴趣的文章:
随机阅读: