2009-05-26 7 views
10

Kręcę się w kółko i potrzebuję pomocy w implementacji Custom MembershipUser, aby móc dodać własne właściwości niestandardowe do MembershipUser.Wdrażanie Custom MembershipUser

śledzę przykład na tej stronie: How to: Implement a Custom Membership User

Problem mam jest w konstruktorze CustomMembershipUser, myślę.

Moje CustomMembershipUser ma te trzy dodatkowe właściwości: 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?? 

    } 
} 

Wołam go tak:

MembershipUser mu = Membership.GetUser(UserName); 

    CustomMembershipProvider p = (CustomMembershipProvider)Membership.Provider; 

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

    object userId = memUser.ProviderUserKey; 

ProviderUserKey jest nieważne i tak są inne wartości.

Jak mogę uzyskać dodatkowe właściwości, które dodałem?

Dzięki

Odpowiedz

11

To działa dla mnie:

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 
+0

Jimmy, Dziękuję! Twój przykład sprawił, że sprawy stały się jaśniejsze i teraz moja implementacja działa. Czy możesz opublikować kod dla konstruktora swojej CustomMembership? Dziękuję innym, którzy udzielili wskazówek dotyczących używania profili i dzielenia się swoimi doświadczeniami. – Picflight

+0

Picflight, nie jestem pewien, co masz na myśli przez "konstruktora dla CustomMembership". Moja klasa CustomerMembershipProvider nie ma konstruktora. – jimmystormig

+3

Chciałbym wskazać każdemu, kto znalazł to pytanie, mimo że jest to "akceptowana" odpowiedź, jest to * NIE * właściwy sposób wykonania tego zadania - wszelkie dodatkowe właściwości należące do użytkownika powinny być przechowywane w profilu, który pozwala osiągnąć to i wiele więcej przy znacznie mniejszym wysiłku i bez rozbijania modelu, tak jak pokazuje to tutaj kod. Zobacz moją odpowiedź poniżej, aby uzyskać więcej informacji. –

12

Na podstawie własnego doświadczenia staramy się robić dużo tego samego, próbuje użyć MembershipProvider zrobić, będzie to sprzeczne z intuicją i ostatecznie frustrujące doświadczenie.

Ideą modelu dostawcy członkostwa nie jest zmiana lub poszerzenie definicji użytkownika, tak jak próbujesz to uczynić - umożliwienie Ramie alternatywnych sposobów dostępu do informacji, które już zostały został zdefiniowany jako należący do "MembershipUser".

Myślę, że to, czego naprawdę szukasz, to profil użytkownika. Korzystanie z profili ASP.NET jest łatwiejsze niż wdrożenie własnego operatora. You can find the overview here.

+1

+1 za przegląd. Możesz również zajrzeć do poniższego artykułu OdeToCode. Podaje przykład użycia klasy Profile w sposób podobny do opisanego. http://www.odetocode.com/articles/440.aspx –

+0

Używam dostawcy profilu do kojarzenia imienia i nazwiska z członkami użytkowników. Ma kilka irytujących cech, ale ogólnie jest to szybki sposób na zintegrowanie funkcji profilu z aplikacją, która korzysta z członkostwa. –

3

Po prostu dlatego, że wiesz, starałem się wcześniej przejść ścieżkę MembershipProvider i jest ona długa i wietrzna. Możesz zobaczyć, czy samo tworzenie klas implementujących IPrincipal i IIdentity zaspokoi twoje potrzeby, ponieważ pociąga za sobą dużo mniej narzutów.