ASP.NET Form Authentication - Membership Authentication

1.简介

在 ASP.NET 应用程序中,Membership 类用于验证用户凭据并管理用户设置(如密码和电子邮件地址),提供用户及角色管理功能。Membership 类可以独自使用,或者与 Forms Authentication 一起使用,以创建一个完整的 Web 应用程序或网站的用户身份验证系统。

2.使用

Membership 类提供的功能可用于: 
1)创建新用户。
2)将成员资格信息(用户名、密码、电子邮件地址及支持数据)存储在 Microsoft SQL Server 或其他类似的数据存储区。
3)对访问网站的用户进行身份验证。可以以编程方式对用户进行身份验证,也可以使用 Login 控件创建一个只需很少代码或无需代码的完整的身份验证系统。
4)管理密码。包括创建、更改、检索和重置密码等等。可以选择配置 ASP.NET 成员资格以要求一个密码提示问题及其答案来对忘记密码的用户的密码重置和检索请求进行身份验证。
默认情况下,ASP.NET 成员资格可支持所有 ASP.NET 应用程序。默认成员资格提供程序为 SqlMembershipProvider 并在计算机配置中以名称 AspNetSqlProvider 指定。SqlMembershipProvider 的默认实例配置为连接到 Microsoft SQL Server 的一个本地实例。

要使用membership,需要对数据库进行一些设置,数据库中有一些固有的表、视图和存储过程,我们自己的表中没有这些东西。不过,我们可以通过向导来创建它们,那就是aspnet_regsql.exe,一般来说它位于:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727(可能略有差异)它既可以创建数据库中的选项,也可以移除这些设置。




这里选择默认数据库,会自动生成一个aspnetdb的数据库,里面包含了membership需要的表及存储过程等。


新建工程结构如下:


接下来就是配置web.config

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
  <connectionStrings>
    <add name="myLocalSqlServer" connectionString="server=localhost;
         uid=sa;pwd=1234;database=aspnetdb"/>
  </connectionStrings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
    <membership defaultProvider="mySqlMembershipProvider">
      <providers>
        <add name="mySqlMembershipProvider" 
             type="System.Web.Security.SqlMembershipProvider, System.Web, Version=4.0.0.0, 
             Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
             connectionStringName="myLocalSqlServer" 
             enablePasswordRetrieval="false" 
             enablePasswordReset="true" 
             requiresQuestionAndAnswer="true" 
             applicationName="/" 
             requiresUniqueEmail="false" 
             passwordFormat="Hashed" 
             maxInvalidPasswordAttempts="5" 
             minRequiredPasswordLength="7" 
             minRequiredNonalphanumericCharacters="1" 
             passwordAttemptWindow="10" 
             passwordStrengthRegularExpression=""/>
      </providers>
    </membership>
    <roleManager enabled="true" defaultProvider="myAspNetSqlRoleProvider">
      <providers>
        <add name="myAspNetSqlRoleProvider"
             connectionStringName="myLocalSqlServer"
             applicationName="/"
             type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, 
             Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
      </providers>
    </roleManager>
    <authentication mode="Forms">
      <forms loginUrl="Login.aspx"
             protection="All"
             timeout="30"
             name=".ASPXAUTH"
             path="/"
             slidingExpiration="true"
             defaultUrl="Default.aspx"
             cookieless="UseDeviceProfile"/>
    </authentication>
    <authorization>
      <allow users="?"/>
    </authorization>
  </system.web>
</configuration>
1)Register核心逻辑

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;

namespace AspNetMembershipAuthentication
{
    public partial class Register : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void BtnRegis_Click(object sender, EventArgs e)
        {
            string username = TboUsername.Text.Trim();
            string password = TboPassword.Text.Trim();
            string role = DDLRole.SelectedItem.Value;
            MembershipCreateStatus status;
            Membership.CreateUser(username, password, "justinf2@wicresoft.com", "are you ok?", "ok", true,out status);
            if (!Roles.GetAllRoles().Contains(role))
            {
                Roles.CreateRole(role);
            }
            Roles.AddUserToRole(username, role);
            Response.Redirect(status == MembershipCreateStatus.Success ? "Login.aspx" : "Error.aspx");
        }
    }
}
首先创建用户,然后创建用户与角色的关联,如果用户选择的角色还未创建,那么就先创建该角色,再添加关系!

2)登录逻辑

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace AspNetAuthentication
{
    public partial class Login : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void BtnLogin_Click(object sender, EventArgs e)
        {
            string username = TboUsername.Text.Trim();
            string password = TboPassword.Text.Trim();
            if(Membership.ValidateUser(username,password))
            //if (TboUsername.Text == "admin" && TboPassword.Text == "12345")
            {
                /* 
                * 为用户名创建一个身份验证票据,并将其添加到响应的Cookie中 
                * SetAuthCookie的第一个参数为已验证的用户的名称。 
                * SetAuthCookie的第二个参数为true时代表创建持久Cookie
                * (跨浏览器会话保存的 Cookie),为false则关闭浏览器后要重新验证身份 
                */
                FormsAuthentication.SetAuthCookie(TboUsername.Text, false);
            }

            //如果URL中没有传递ReturnUrl参数,则跳转到Default.aspx,
            //否则跳转到ReturnUrl参数值指定的网页 
            Response.Redirect(string.IsNullOrEmpty(Request.QueryString["ReturnUrl"])
                ? "Default.aspx"
                : Request.QueryString["ReturnUrl"]);
        }
    }
}
使用Membership去校验用户是否允许登录,其他和Form认证的时候一样的。


数据库中的数据情况如下,关系表只包含两个字段,RoleID和UserID,十分简洁明了。

3)效果

注册页面


登录页面


3.总结

Membership采用了一种基于Application的用户,角色管理机制对用户,角色进行统一管理,提供了各种相关的API,使用起来也十分方便。其实ASP.NET提供了基于Membership的控件来实现登录功能。CreateUserWizard控件即可实现。

<asp:CreateUserWizard ID="CreateUserWizard1" runat="server" ContinueDestinationPageUrl="~/Default.aspx"> 
</asp:CreateUserWizard>
这是一个典型的配置
相关文章

相关标签/搜索