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

Как указано здесь 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 ]

2 голосов
/ 09 января 2011

Прочитал это 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;
        }
    }
1 голос
/ 06 января 2011

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

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

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

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

0 голосов
/ 06 января 2011

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

class MyMembershipProvider : MembershipProvider{...}

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

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

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

...