首页 > 代码库 > 通过 Membership用户存储验证用户凭据,实现会员控制

通过 Membership用户存储验证用户凭据,实现会员控制

对于使用表单身份验证的 web 网站来说 , 用户通过访问登录页面并输入自己的凭据来登录网站。系统会将用户输入的凭据与数据库中的内容相对比。如果凭据有效,则会授予该用户一个表单身份验证票证,该票证是一个安全令牌,用以指示该访问者的身份标识和真实性。
本文实例说明怎样吧验证工作委托给已配置的 Membership 提供者。

一,数据库准备及配置Web.config

如果数据库是由aspnet_regsql创建的(运行aspnet_ressql.exe会自动生成11个以aspnet_开头的数据库),则只需要在web.config里修改连接串即可;如果想用自己定义的用户数据存储格式,则需要写一个自己的membership provider 。(默认的各类的provider是使用sql express的,需要通过重载providerName)
<membership>
      <providers>
        <remove name="AspNetSqlMembershipProvider"/>
        <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="PCLComplaintsConnectionString" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" applicationName="/" requiresUniqueEmail="false" minRequiredPasswordLength="4" minRequiredNonalphanumericCharacters="0" passwordFormat="Hashed" maxInvalidPasswordAttempts="100" passwordAttemptWindow="10" passwordStrengthRegularExpression=""/>
      </providers>
    </membership>
enablePasswordReset 设置为 true. //表示允许membership自动重设密码。
requiresQuestionAndAnswer 设置为 false.//控制锁定后不输入原密码重设密码。
maxInvalidPasswordAttempts – 指定在一个时间周期内允许用户进行的无效密码尝试的次数 , 超过该次数会锁定相应帐户。默认值为 5 。
passwordAttemptWindow //以分钟为单位指定一个时间周期 , 如果在该时间内达到指定的无效登录尝试次数 , 就会锁定帐户。默认值为 10 。

二,Membership验证原理及必要的说明

SqlMembershipProvider 通过 aspnet_Membership_GetPasswordWithFormat 存储过程获取指定用户的密码 , 从而对用户提供的凭据进行验证。我们记得, SqlMembershipProvider 以这三种格式之一保存用户密码:明文、加密、散列 (hashed) 。 aspnet_Membership_GetPasswordWithFormat 存储过程以其原始格式返回密码。对于加密密码和散列密码, SqlMembershipProvider 将传入到 ValidateUser 方法中的 password 值转换为其对应的加密或散列状态,然后将其与数据库的返回值相对比。如果数据库中保存的密码与用户输入并经过格式化处理后的密码相匹配,用户凭据就是有效的。
技术分享
Membership 类依赖于成员资格提供程序与数据源通信。.NET Framework 包括一个 SqlMembershipProvider(将用户信息存储在 Microsoft SQL Server 数据库中)和一个 ActiveDirectoryMembershipProvider(允许在 Active Directory 或 Active Directory 应用程序模式 (ADAM) 服务器上存储用户信息)。还可以实现一个自定义成员资格提供程序与可由 Membership 类使用的其他类似的数据源进行通信。自定义成员资格提供程序将继承 MembershipProvider抽象类。有关更多信息,请参见 实现成员资格提供程序。

三,建立登录页面验证登录

OK,大概逻辑已经描述出来了,现在,我们先建一个登录页面。
ASP.NET 登录控件(Login、LoginView、LoginStatus、LoginName 和 PasswordRecovery)实际上封装了 Membership 类,从而提供一种便捷的用户验证机制。
login 控件自动根据 Membership 框架的用户存储来验证用户提供的凭据。
现在建一个Default.aspx 空窗体网页,然后拉入login控件。
技术分享Login 控件还有一个名为 FailureText 的属性可以用来设置自己的登陆失败提示信息。否则就根据Membership内嵌的提示“Your login attempt was not successful.Please try again”。

如果想自定义编写响应代码,有两种方法,一是添加处理 Login1_Authenticate 事件。
protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
	//your code
}
另外则是触发以下button 点击事件,使触发 Membership 框架的用户存储来验证用户;
protected void LoginButton_Click(object sender, EventArgs e)
{
     // Validate the user against the Membership framework user store
     if (Membership.ValidateUser(UserName.Text, Password.Text))
     {
          // Log the user into the site
          FormsAuthentication.RedirectFromLoginPage(UserName.Text, RememberMe.Checked);
     }
     // If we reach here, the user's credentials were invalid
     InvalidCredentialsMessage.Visible = true;
}
该代码相当简单。代码首先调用了 Membership.ValidateUser 方法 , 将所提供的用户名和密码传入该方法。 . 若该方法返回为 True,则通过 FormsAuthentication 类的 RedirectFromLoginPage 方法使用户登录进网站。(如《 表单身份验证概述 》教程所述, FormsAuthentication.RedirectFromLoginPage 创建表单身份验证票证,然后将用户重定向到恰当的页面。)然而,若票证无效,会显示 InvalidCredentialsMessage 标签,告知用户其输入的用户名或密码不正确

通过 Membership用户存储验证用户凭据,实现会员控制