Пользовательская ASPNetMembership FailureInformation всегда нулевая, проблема с OnValidatingPassword

Как сказано здесь http://msdn.microsoft.com/en-us/library/system.web.security.membershipprovider.onvalidatingpassword.aspx

"Когда событие ValidatingPassword завершено, свойства объекта ValidatePasswordEventArgs, предоставленного в качестве параметра e, можно проверить, чтобы определить, следует ли отменить текущее действие и следует ли генерировать конкретное исключение, сохраненное в свойстве FailureInformation".

Вот некоторые подробности / код, который действительно показывает, почему FailureInformation может быть нулевым http://forums.asp.net/t/991002.aspx

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

Затем я попытался отладить System.Web.ApplicationServices.dll(в.NET 4.0 System.Web.Security, расположенной здесь) Framework Framework, чтобы увидеть, что на самом деле там происходит, но я не могу войти в эту сборку, возможно, из-за этого [TypeForwardedFrom("System.Web, Version=2.0.0.0, Culture=Neutral, PublicKeyToken=b03f5f7f11d50a3a")] public abstract class MembershipProvider : ProviderBase

Легко я могу войти в любую другую сборку.NET 4.0, но в этом нет. Я сделал проверку, символы для System.Web.ApplicationServices.dll загружены.

Теперь у меня есть только одна идея, как это исправить - переопределить метод OnValidatingPassword(ValidatePasswordEventArgs e).

Это моя история.

Может быть, кто-то может помочь:

1) Есть идеи, почему не работает OnValidatingPassword?

2) Есть идеи, как это сделать?

3 ответа

Решение

Прочитал это http://forums.asp.net/t/991002.aspx еще раз. Вот мое решение

    //Override OnValidatingPassword
    protected override void OnValidatingPassword(ValidatePasswordEventArgs args)
    {
        //Any logic to process password validation conditions
        //e.g:
        if (args.Password.Length < MinRequiredPasswordLength)
            args.FailureInformation = new ArgumentException(String.Format("Password is too short, min password length {0}", MinRequiredPasswordLength.ToString()));

        if (args.UserName == args.Password)
            args.FailureInformation = new ArgumentException(String.Format("Password should not be equal to username"));

        //Also here could be any logic to throw an exception if needed
        //e.g:
        if (args.FailureInformation != null)
            throw args.FailureInformation;

        //Calling base
        base.OnValidatingPassword(args);

        if (args.Cancel)
        {
            if (args.FailureInformation == null)
                args.FailureInformation = new ArgumentException(String.Format("Custom Password Validation Failure for password '{0}'", args.Password));

            throw args.FailureInformation;
        }
    }

Вам не нужно переопределять метод OnValidatingPassword, но, как сказано в документации, вам нужно обработать событие ValidatingPassword. Проверьте MembershipValidatePasswordEventHandler.

Используйте.NET Reflector и проверьте метод ChangePassword класса SqlMembershipProvider. Вы увидите, что у SqlMembershipProvider не зарегистрирован ни один обработчик для события ValidatingPassword.

Так что я думаю, что в OnInit вашего пользовательского провайдера членства вы регистрируетесь в Membership.ValidatingPassword и в обработчике вы делаете кодирование. Пример примера по ссылке выше.

Надеюсь, я не неправильно понял ваш вопрос.

Ваш вопрос указывает на то, что вы используете поставщика нестандартного членства? Итак, я полагаю, что вы вносите свой вклад в MembershipProvider напрямую?

class MyMembershipProvider : MembershipProvider{...}

В этом случае OnValidatingPassword никогда не вызывается автоматически... вы должны вызывать его самостоятельно.

В общем, я в замешательстве. Не могли бы вы уточнить ваши настройки? Вы используете поставщика членства по умолчанию или пользовательский? Если есть, какой класс вы наследуете?

Что касается просмотра кода, вы можете использовать Reflector, чтобы сделать это.

Другие вопросы по тегам