Унаследуйте SqlMembershipProvider и отключите CreateUser () и DeleteUser () - PullRequest
1 голос
/ 03 марта 2011

Я хочу унаследовать SqlMembershipProvider, настроить параметры членства для использования производного настраиваемого поставщика и запретить кому-либо звонить Membership.CreateUser() и Membership.DeleteUser().

У меня есть внешнее приложение, которое предложит пользователю добавить/ delete механизм, который делает больше, чем встроенный членство.

Мне удалось переопределить CreateUser () и DeleteUser (), чтобы выдать NotSupportedExceptions, когда Membership.CreateUser () или Membership.DeleteUser ()называется.

Затем я попробовал 2 пользовательских метода и каждый из них вызывал base.CreateUser() и base.DeleteUser(), но получил нулевые исключения.Я считаю, что проблема в том, что базовые методы доступны только переопределенным функциям, а не пользовательским.

Мой код указан ниже:

public class UserMembershipSQL : SqlMembershipProvider
{
    internal MembershipUser CreateUserCustom(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
    {
        //do stuff here -- not accessible by Membership.CreateUser

        //currently throws a null exception even though all parameters are set properly
        return base.CreateUser(username, password, email, passwordQuestion, passwordAnswer, isApproved, providerUserKey, out status);
    }

    internal bool DeleteUserCustom(string username, bool deleteAllRelatedData)
    {   
        //do stuff here -- not accessible by Membership.DeleteUser
        return base.DeleteUser(username, deleteAllRelatedData);
    }

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

    public override bool DeleteUser(string username, bool deleteAllRelatedData)
    {
        throw new NotSupportedException();
    }
}

Спасибо.

Ответы [ 3 ]

1 голос
/ 03 апреля 2011

Web.config:

<membership defaultProvider="Custom">
    <providers>
        <clear /> <!-- remove the built-in -->
        <add name="Custom" ... /> <!-- your own only -->
    </providers>
</membership>

Код:

public class UserMembershipSQL : SqlMembershipProvider
{
    public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
    {
        // do your stuff, don't call base
    }

    public override bool DeleteUser(string username, bool deleteAllRelatedData)
    {
        // do your stuff, don't call base
    }
}

Использование:

Membership.CreateUser(); // will call Membeship.Provider.Create(), i.e. - yours
0 голосов
/ 03 апреля 2011

Вероятно, это потому, что вы не указали его в разделе «Поставщики» узла конфигурации system.web \ members, как указано abatishchev . Загрузите исходный код модели провайдера ASP.Net с здесь . Наследуйте от образца класса SqlMembershipProvider и посмотрите, как работают внутренние компоненты SqlMembershipProvider. Исключение NullReference вызвано тем, что свойство PasswordStrengthRegularExpression не инициализировано. Включение вашего провайдера - единственное решение, потому что если вы этого не сделаете, метод CreateUser все равно не будет работать, потому что ваш пользовательский провайдер отсутствует в списке «одобренных» провайдеров. Конечно, вы можете обойти это, указав утвержденное имя провайдера при вызове метода base.Initialize, скажем, в конструкторе вашего провайдера пользовательского членства, но я не думаю, что это правильно. Кроме того, вы не сможете включить своего провайдера в файл конфигурации, потому что ваш провайдер будет инициализирован дважды, что приведет к исключению. Снова проверьте исходный код.

0 голосов
/ 03 марта 2011

Вам нужно инициализировать базовый класс в своем собственном Initialize методе:

public override void Initialize(string name, NameValueCollection config)
{
    [...] // your own initialization stuff

    base.Initialize(name, config);
}
...