2012-06-25 3 views
0

У меня здесь есть проблема. Я работаю над многоуровневым CAB-приложением, которое использует веб-сервис для аутентификации и интерфейс WinForms.Нарушение/приостановка процесса входа в систему изменение имени истекшего пароля

Теперь меня попросили ввести срок действия пароля и получили необходимые данные, и я использовал их, чтобы узнать, истек ли пароль пользователя, только дело в том, что у меня возникли проблемы с приостановкой процесса входа в систему и «перенаправление» на форму ChangePassword.

То, что я пытался, выбрасывает пользовательское исключение, называемое PasswordExpiredException (наследует System.Exception и позже ApplicationExcionion, если это не работает) и вызывает ChangePassword.ShowDialog() в catch. Это вызывает головную боль, потому что он делает то, что мне чертовски хорошо говорит, что нужно делать, и бросает неподходящее исключение при входе в систему, если пароль истек.

Итак, могу ли я отказаться от своего исключения, когда это будет сделано? ИЛИ, должен ли я отказаться от идеи и сделать это «правильно»? Не имея понятия, что это может быть

Основной Прогон стеком вызовов при входе в систему ~~>

Logon.Cs.btnOK_Click ~~> wsAuthentication.GetProvider(GetUserDBInstace(UserName))~~> 
ASPNETAuthentication.Authenticate(username,password)~~> 
CheckIfExipred(MembershipUser.LastPasswordChangedDate) 
~Y~> throw PasswordExpiredException; //getting it to go back all the way to the UI, opening up ChangePassword.cs, leaving me with an authenticated user who's about to change his old password 
~N~> //continue login, ignoring all my hard work 

ответ

3

Вместо того, чтобы бросать исключение, я бы подумал о возвращении своего рода AuthenticationResult. Мне кажется, что вы пытаетесь использовать обработку исключений для управления потоком управления. Исключения должны быть исключительными. То, что вы предлагаете, звучит как вполне законное бизнес-правило.

public class AuthenticationResult { 
    public bool AreCredentialsValid { get; set; } 
    public bool IsAccountLocked { get; set; } 
    public bool RequiresPasswordChange { get; set; } 
} 

Затем вы можете запросить возвращаемый объект, чтобы определить, что делать дальше, а не пытаться обработать исключение.

+0

спасибо, я посмотрю на это – Dani

0

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

Возможно, ваш метод входа в систему может вернуть объект пользователя, содержащий логическое значение, указывающее, что срок действия пароля истек, или вы можете использовать параметр out для входа в систему для возврата той же информации. Я бы предпочел первый, поскольку мне нравится избегать параметров out, если это вообще возможно.

Смежные вопросы