Membership.ValidateUser方法如何访问数据库?

4

在我的MVC项目开始时,我希望构建一个会员系统,并使用Membership.ValidateUser方法来验证凭据。然而,我无法理解这个方法如何访问我的数据库并检查我的电子邮件和密码信息。

[HttpPost]
[ActionName("Login")]
public ActionResult Login(LoginModel loginModel)
{
        if (Membership.ValidateUser(loginModel.Email, loginModel.Password))
        {
            FormsAuthentication.SetAuthCookie(loginModel.Email, true);
            return Json(true);
        }

        return new JsonNetResult() 
        { Data = new { Error = true, Messages = new[] { new { Message = "Wrong username or password" } } } };
}
3个回答

4

它使用在您的Web.config文件中指定的MembershipProvider来验证用户。默认情况下,它使用DefaultMembershipProvider


<add name="MyMembershipProvider" type="MyProject.Domain.Administration.Domain.Membership.MyMembershipProvider" connectionStringName="MembershipDb" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="true" maxInvalidPasswordAttempts="99" minRequiredPasswordLength="1" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" /> 它如何知道我用哪个数据库或表来保存我的凭据? - user2923864
你的数据存储在连接字符串中定义,该连接字符串在代码中通过connectionStringName="MembershipDb"引用,因此它使用你在web.config中定义的名为MembershipDb的连接字符串中的数据库。 - Paul Zahra

2

Membership.ValidateUser方法首先检查您在下面提供的名称与web.config文件中匹配的成员资格defaultProvider:

<membership defaultProvider="SqlProvider" userIsOnlineTimeWindow="15">
      <providers>
        <clear />
        <add name="SqlProvider" type="System.Web.Security.SqlMembershipProvider" 
         connectionStringName="Context" applicationName="myapp" 
         enablePasswordRetrieval="false" enablePasswordReset="true" 
         requiresQuestionAndAnswer="false" requiresUniqueEmail="true" 
         passwordFormat="Hashed" minRequiredPasswordLength="7" 
         minRequiredNonalphanumericCharacters="0" />
      </providers>
    </membership>

上述配置将调用.NET框架抽象类MembershipProvider的ValidateUser(抽象方法),其实现位于SqlMembershipProvider的ValidateUser方法中,您已在web.config文件中进行了配置[如上所示]。在该方法中,它仅调用数据库的两个存储过程,第一个是aspnet_Membership_GetPasswordWithFormat,它检查您的应用程序名称、用户名、最后登录活动日期和当前时间,并根据此进行身份验证;第二个是名称为aspnet_Membership_UpdateUserInfo的其他存储过程,它可以自行解释,因为您会意识到它更新了aspnet_membership表中的列,例如islockedout、lastlockoutdate、failedpasswordattemptcount等。

希望这可以帮助您。


0
要对用户进行Membership框架的验证,可以使用Membership类的ValidateUser方法。ValidateUser方法接受两个输入参数 - 用户名和密码,并返回一个布尔值,指示凭据是否有效。与我们在之前的教程中讨论的CreateUser方法类似,ValidateUser方法将实际的验证委托给配置的Membership提供程序。
SqlMembershipProvider通过使用aspnet_Membership_GetPasswordWithFormat存储过程获取指定用户的密码来验证提供的凭据。请记住,SqlMembershipProvider使用三种格式之一存储用户的密码:明文、加密或哈希。aspnet_Membership_GetPasswordWithFormat存储过程以原始格式返回密码。对于加密或哈希密码,SqlMembershipProvider将传递给ValidateUser方法的密码值转换为其等效的加密或哈希状态,然后将其与从数据库返回的值进行比较。如果数据库中存储的密码与用户输入的格式化密码匹配,则凭据有效。
来源: https://learn.microsoft.com/zh-cn/aspnet/web-forms/overview/older-versions-security/membership/validating-user-credentials-against-the-membership-user-store-cs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接