2011-02-08 1 views
1

Я разработал собственный пользовательский поставщик членства и роли. Класс System.Web.Security.Membership вызывает метод CreateUser, который я не реализовал (специально для меня требуется дополнительная информация в моем MemberhipUser).Класс членства вызывает «неправильный» метод для моего настраиваемого поставщика?

Должен ли я использовать класс Membership вообще в этом сценарии?

Теперь я приложу к своему собственному провайдеру членства использовать мой реализованный метод CreateUser, это путь? Я чувствую себя немного потерянным, как мне с этим справиться?

((MyMembershipProviderBase)Membership.Provider).CreateUser(username, password, email, lastName, firstName, phoneNumber, out status); 

Провайдер Membership CreateUser-методы:

public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status) 
    { 
     throw new NotImplementedException(); 
    } 

    public MyMembershipUser CreateUser(
     string username, string password, string email, string lastName, string firstName, 
     string phoneNumber, out MembershipCreateStatus status) 
    { 
     // implemented... 
    } 

* Редактировать

Respons на @elkdanger комментарий.

Является ли это видом обертки, о котором вы говорите в своем комментарии?

Теперь класс Membership вызывает стандартный метод CreateUser, который перенаправляет на мою собственную реализацию, проблема в том, что я не могу установить дополнительную информацию для пользователя (имя, имя и фамилия). Это способ пойти, а затем обработать настройку дополнительной информации из другого места (где я создаю своего пользователя)?

public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, 
     string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status) 
    { 
     return this.CreateUser(username, password, email, "", "", "", out status); 
    } 

    public MyMembershipUser CreateUser(
     string username, string password, string email, string lastName, string firstName, 
     string phoneNumber, out MembershipCreateStatus status 

     ) 
    { 
     var args = 
    new ValidatePasswordEventArgs(username, password, true); 

     OnValidatingPassword(args); 

     if (args.Cancel) 
     { 
      status = MembershipCreateStatus.InvalidPassword; 
      return null; 
     } 


     if (RequiresUniqueEmail && GetUserNameByEmail(email) != "") 
     { 
      status = MembershipCreateStatus.DuplicateEmail; 
      return null; 
     } 

     MembershipUser u = GetUser(username, false); 

     if (u == null) 
     { 

      try 
      { 
       status = Repository.CreateUser(username, EncodePassword(password), email, lastName, firstName, 
     phoneNumber); 
      } 
      catch 
      { 
       status = MembershipCreateStatus.ProviderError; 
      } 
      return (MyMembershipUser)GetUser(username, false); 
     } 
     else 
     { 
      status = MembershipCreateStatus.DuplicateUserName; 
      return null; 
     } 
    } 

ответ

0

Бросая таким образом, чтобы получить доступ к конкретному примеру, вы почти полностью минуя точку системы Asp.Net членства. Идея состоит в том, что система работает с известным контрактом на управление своими пользовательскими данными, и когда вам нужно начинать кастинг таким образом, вы нарушаете этот контракт. Я ценю, что это может быть небольшое изменение, но, тем не менее, это немного «запах».

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

Если вы хотите немного почистить это, я вернусь к исходному методу CreateUser, который членство Asp.Net даст вам перегрузку, но создайте оболочку вокруг функциональности членства, которая обеспечит выполнение всех дополнительных деталей, необходимых для Если вы не можете этого сделать (возможно, из-за того, что вы используете стандартные элементы мастера создания пользователей, которые поставляются с Asp.Net), то я бы предложил, чтобы ваши требования не соответствовали потребностям системы членства Asp.Net, и вы «В долгосрочной перспективе лучше разработать свою собственную систему, которая более подходит для того, чего вы пытаетесь достичь.

Удачи вам!

+0

Спасибо за комментарий! Я не знаю, полностью ли понимаю, как должна быть реализована оболочка, которую вы предлагаете, но я попробовал и обновил свой пост выше. – user579089

+0

Я не использую элемент управления Create Wizard, я начал с нового решения MVC и проработал путь к реализации Провайдеров. Цель состоит в том, чтобы иметь возможность использовать встроенные функции пользователя и роли, но иметь контроль над тем, как и какие пользовательские данные (и роли) хранятся в базе данных. – user579089