Как вернуть более подробную ошибку, когда пользователь не может быть проверен - PullRequest
3 голосов
/ 11 января 2012

Я работаю над созданием пользовательского класса для моего проекта asp.net.В классе MembershipProvider функция для проверки пользователя определяется следующим образом.

public abstract bool ValidateUser(string username, string password);

Проблема проверки может быть неудачной по нескольким причинам, поэтому я хочу предоставить более подробное описание причин сбоя при входе в систему (например,пользователь заблокирован и т. д.), но это не может быть сделано через тип возврата bool.Я, конечно, могу создать один из моих методов для проверки следующим образом:

public RichStatusDetailsEnum ValidateUser(string username, string password);

Проблема с вышесказанным заключается в том, что я не смогу вызывать этот метод универсальным способом (только с помощью Membership.ValidateUser).Скорее мне придется создавать экземпляр объекта моего пользовательского провайдера членства и т. Д. И т. Д. Кто-нибудь еще сталкивался с такой же проблемой, и если есть какие-либо более эффективные способы обработки такого типа ситуации?

Ответы [ 2 ]

3 голосов
/ 11 января 2012

Согласно этому MSDN-ресурсу , возврат сообщит вам, если он действителен.Есть только два параметра (имя пользователя и пароль).Если это возврат false, то вы знаете, что один из них выключен.Вы всегда можете проверить правильность UserName, вызвав Membership.GetUser () .Если возвращенный объект MembershipUser не является нулевым, то вы знаете, что UserName является правильным.В этом случае это заставит вас поверить, что в случае сбоя ValidateUser() это неверный пароль.

Чтобы проверить, заблокирован ли пользователь : для объекта MembershipUserкоторый возвращается из GetUser(), вы можете проверить, заблокирован ли пользователь свойством Membershipuser.IsLockedOut.

2 голосов
/ 11 января 2012

Описание

Один из способов сделать это -

  • Сохраните причину сбоя проверки в HttpContext.Current.Items Collection
  • Если ValidateUser не удалось, получите данные и сделайте что-нибудь (например, добавьте ошибку в ModelState.AddModelError("Property","Message");

Пример

public override bool ValidateUser(string username, string password)
{
    // your custom logic goes here
    HttpContext.Current.Items["ValidateUserResult"] = ValidateUserFailed.UserNameWasWrong;
    return false;
}

public enum ValidateUserFailed
{
    UserNameWasWrong, PasswordWasWrong, BecauseIDontLikeYou
}

другой ваш класс

Дополнительная информация

...