如何在无法验证用户时返回更详细的错误

时间:2012-01-11 17:59:09

标签: asp.net-mvc-3 asp.net-membership membership-provider

我正在为我的asp.net项目创建自定义成员资格类。在MembershipProvider类中,用户验证的功能定义如下。

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

问题是验证可能因为几个原因而失败,所以我想提供更详细的说明,说明为什么登录失败(例如,用户被锁定等),但这不能通过bool返回类型完成。我当然可以创建我的验证方法之一,如下所示

public RichStatusDetailsEnum ValidateUser(string username, string password);

上面的问题是我无法以通用方式调用此方法(仅限于Membership.ValidateUser)。相反,我将不得不实例化我的自定义成员资格提供者等的对象。是否有其他人遇到过相同的问题,是否有更好的方法来处理这种情况?

2 个答案:

答案 0 :(得分:3)

根据this MSDN resource,返回将告诉您它是否有效。只有两个参数(用户名和密码)。如果它是false返回,那么您知道其中一个已关闭。您始终可以通过致电Membership.GetUser()来测试UserName是否正确。如果返回的MembershipUser对象不为null,则表示UserName是正确的。在这种情况下,这会让您相信如果ValidateUser()失败,则表示密码错误。

要查看用户是否已被锁定:对于从MembershipUser返回的GetUser()对象,您可以测试该用户是否被该属性锁定{ {1}}。

答案 1 :(得分:2)

描述

完成此任务的一种方法是

  • HttpContext.Current.Items集合
  • 中存储验证失败的原因
  • 如果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
}

你的其他班级

更多信息