0

我这里有点麻烦。我正在开发一个使用 Web 服务进行身份验证和 WinForms 前端的多层 CAB 应用程序。

现在,我被要求实施密码到期并获得了必要的详细信息,并且我已经使用它们来查看用户的密码是否已过期,唯一的问题是,我在暂停登录过程和“重定向”到ChangePassword 表单。

我一直在尝试的是抛出一个名为 PasswordExpiredException(inherits System.Exception 和后来的 ApplicationExcetion 当它不起作用时) 的自定义异常并在 catch 中调用 ChangePassword.ShowDialog() 。这引起了头疼,因为它正在做我该死的告诉它做的事情,并且如果密码已过期,则会在登录时抛出一个不合时宜的异常。

那么,当它完成它的工作时,我可以取消抛出我的异常吗?或者,我应该放弃这个想法并“正确”地去做吗?不知道那可能是什么

登录时调用堆栈的基本运行~~>

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
4

2 回答 2

3

我不会考虑抛出异常,而是考虑返回某种AuthenticationResult. 在我看来,您正在尝试使用异常处理来操纵控制流。例外应该是例外。您的建议听起来像是完全合法的商业规则。

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

然后,您可以查询返回的对象以确定下一步要做什么,而不是尝试处理异常。

于 2012-06-25T14:14:07.413 回答
0

过期的密码不是登录时的例外情况(可能在其他时候,例如在检查特定操作的授权时),因此PasswordExpiredException在这种情况下,从登录方法中抛出您的密码可能不是控制您的流程的最佳方法。

也许您的登录方法可以返回一个用户对象,其中包含一个指定密码已过期的布尔值,或者您可以out在登录时使用一个参数来返回相同的信息。我更喜欢前者,因为我想尽可能避免out使用参数。

于 2012-06-25T14:12:30.617 回答