2009-05-26 21 views
10

Estoy dando vueltas en círculos y necesito ayuda para implementar un usuario de membresía personalizado para que pueda agregar mis propias propiedades personalizadas al usuario de membresía.Implementación del usuario de membresía personalizado

He estado siguiendo el ejemplo en este sitio: How to: Implement a Custom Membership User

El problema que estoy teniendo es en el constructor de CustomMembershipUser, creo.

My CustomMembershipUser tiene estas tres propiedades adicionales: 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?? 

    } 
} 

La llamo así:

MembershipUser mu = Membership.GetUser(UserName); 

    CustomMembershipProvider p = (CustomMembershipProvider)Membership.Provider; 

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

    object userId = memUser.ProviderUserKey; 

El ProviderUserKey es nulo y también lo son los otros valores.

¿Cómo puedo obtener las Propiedades adicionales que agregué?

Gracias

Respuesta

11

Esto es trabajo para mí:

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, ¡Gracias! Tu ejemplo dejó las cosas más claras y ahora la implementación está funcionando. ¿Puede publicar el código para el constructor de su CustomMembership? Gracias a los demás que han proporcionado orientación sobre el uso de perfiles y el intercambio de sus experiencias. – Picflight

+0

Picflight, no estoy muy seguro de lo que quiere decir con "constructor para CustomMembership". Mi clase CustomerMembershipProvider no tiene un constructor. – jimmystormig

+3

Me gustaría señalar para cualquier persona que encuentre esta pregunta que, aunque esta es la respuesta "aceptada", esta es * NO * la forma correcta de llevar a cabo esta tarea: cualquier propiedad adicional que pertenezca a un usuario debe almacenarse en un perfil, lo que le permite lograr esto y mucho más con mucho menos esfuerzo y sin romper el modelo como lo hace el código que se muestra aquí. Ver mi respuesta a continuación para más información. –

12

Basado en mi propia experiencia tratando de hacer más de lo mismo, tratando de utilizar el MembershipProvider para hacer esto será una experiencia frustrante y en última instancia, contrario a la intuición.

La idea del modelo de proveedor de membresía no es cambiar o aumentar la definición de un usuario, ya que está tratando de hacerlo; es permitir que el Marco sea un medio alternativo de acceder a la información que ya tiene se ha definido como perteneciente a un "Usuario de membresía".

Creo que lo que realmente está buscando es un perfil de usuario. Usar perfiles ASP.NET es mucho más fácil que implementar su propio proveedor. You can find the overview here.

+1

+1 para la visión general. Además, es posible que desee consultar el artículo de OdeToCode a continuación. Proporciona un ejemplo de cómo usar la clase de perfil de manera similar a lo que ha descrito. http://www.odetocode.com/articles/440.aspx –

+0

Estoy usando el proveedor de perfiles para asociar nombres y apellidos con usuarios de membresía. Tiene algunas características molestas, pero en general es una forma rápida de integrar la funcionalidad de perfil en su aplicación que está utilizando membresía. –

3

Para que lo sepas, he tratado de ir por la ruta MembershipProvider antes, y es una larga y ventosa. Es posible que vea si la creación de clases que implementen IPrincipal e IIdentity satisfará sus necesidades, ya que implican mucho menos sobrecarga.

Cuestiones relacionadas