Класс членства вызывает «неправильный» метод для моего пользовательского провайдера? - PullRequest
1 голос
/ 09 февраля 2011

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

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

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

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

Членство провайдера 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...
    }

* Edit

Отвечает на комментарий @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;
        }
    }

1 Ответ

0 голосов
/ 09 февраля 2011

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

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

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

Удачи!

...