membership与成员资格

membership成员资格是ASP.NET 成员资格为您提供了一种验证和存储用户凭据的内置方法。所以,ASP.NET 成员资格可帮助您管理网站中的用户身份验证。它包含如下功能 web

  • 建立新用户和密码。
  • 将成员资格信息(用户名、密码和支持数据)存储在 Microsoft SQL Server、Active Directory 或其余数据存储区。
  • 对访问站点的用户进行身份验证。能够以编程方式验证用户,也可使用 ASP.NET 登陆控件建立一个只需不多代码或无需代码的完整身份验证系统。
  • 管理密码,包括建立、更改和重置密码。根据您选择的成员资格选项不一样,成员资格系统还能够提供一个使用用户提供的问题和答案的自动密码重置系统。
  • 公开通过身份验证的用户的惟一标识,您能够在您本身的应用程序中使用该标识,也能够将该标识与 ASP.NET 个性化设置和角色管理(受权)系统集成。
  • 指定自定义成员资格提供程序,这使您能够改成用本身的代码管理成员资格及在自定义数据存储区中维护成员资格数据

       

    它其实是一个系统中用户管理的一部分(大体包含用户密码验证,用户的增删改查,可是用户的信息——即用户类的属性是固定的)。ASP.NET 成员资格由一组类和接口组成,这些类和接口可建立和管理用户,并基于用户提供的凭据来对用户进行身份验证。类的参考MSDN中《成员资格类》。 算法

    下面则围绕membership的使用,对membershipProvider的扩展,对membershipUser的扩展这几方面来实践。 sql

       

    Membership类的使用 数据库

    先介绍在web.config中的配置 编程

    <membership
    
    <!--默认成员资格提供程序的名称-->
    
    defaultProvider="provider name"
    
    <!--指定用户账户的上次活动日期时间戳以后的分钟数,在这段时间内,该用户被视为处于联机状态-->
    
    userIsOnlineTimeWindow="number of minutes"
    
    <!--指定用于对密码值进行哈希运算的加密算法的名称。默认SHA1,-->
    
    hashAlgorithmType="SHA1">
    
    <!--定义成员资格提供程序的集合。-->
    
    <providers>
    
    <!-- SqlMembershipProvider syntax -->
    
    <add name="string"
    
    type="string"
    
    connectionStringName="string"
    
    applicationName="MyApplication"
    
    commandTimeout
    
    description
    
    enablePasswordRetrieval="false"
    
    enablePasswordReset="true"
    
    requiresQuestionAndAnswer="true"
    
    requiresUniqueEmail="false"
    
    passwordFormat="Hashed"
    
    maxInvalidPasswordAttempts="5"
    
    passwordAttemptWindow="10"
    
    minRequiredPasswordLength
    
    minRequiredNonalphanumericCharacters
    
    passwordStrengthRegularExpression
    
    />
    
    <!-- ActiveDirectoryMembershipProvider syntax -->
    
    <add
    
    name="string"
    
    type="string"
    
    applicationName
    
    attributeMapUsername="string"
    
    attrbuteMapEmail="string"
    
    attributeMapPasswordQuestion="string"
    
    attributeMapPasswordAnswer="string"
    
    attributeMapFailedPasswordAnswerCount="number"
    
    attributeMapFailedPasswordAnswerTime="interval"
    
    attributeMapFailedPasswordAnswerLockoutTime="interval"
    
    clientSearchTimeout="interval"
    
    serverSearchTimeout
    
    connectionUsername="string"
    
    connectionPassword="string"
    
    connectionProtection="string"
    
    connectionStringName="connection string identifier"
    
    enablePasswordReset="true|false"
    
    enablePasswordRetrieval="true|false"
    
    enableSearchMethods="true|false"
    
    requiresQuestionAndAnswer="true|false"
    
    maxInvalidPasswordAttempts="number"
    
    passwordAttemptWindow="number"
    
    commandTimeout="number"
    
    description="string"
    
    passwordAnswerAttemptLockoutDuration="interval"
    
    minRequiredPasswordLength
    
    minRequiredNonalphanumericCharacters
    
    passwordStregnthRegularExpression="string"
    
    passwordAnswerAttemptLockoutDuration="number"
    
    requiresUniqueEmail="true|false"
    
    />
    
    </providers>
    
    </membership>

     

    在provider中,主要分ActiveDirectoryMembershipProvider SqlMembershipProvider 这两种Provider的配置特性有所差别,也列举在上面配置节中。 架构

       

    Demo的Web.config配置以下 app

    <connectionStrings>
    
    <add name="SqlServices" connectionString="Data Source=.;Integrated Security=true;Initial Catalog=StudyASPNETDB" providerName="System.Data.SqlClient"/>
    
    </connectionStrings>
    
    <membership defaultProvider="sqlProvider" hashAlgorithmType="MD5" userIsOnlineTimeWindow="15" >
    
    <providers>
    
    <clear/>
    
    <add name="sqlProvider" type="System.Web.Security.SqlMembershipProvider"
    
    connectionStringName="SqlServices"
    
    passwordFormat="Hashed"
    
    applicationName="/" />
    
    </providers>
    
    </membership>

     

       

    贪方便我用了好久都没有弄过的WebForm,WebForm.aspx关键代码以下 ide

    <form id="form1" runat="server">
    
    <div>
    
    ID: <input runat="server" name="userId" id="userId" type ="text" />
    
    <br />
    
    Password: <input runat="server" name="password" id="password" type="password" />
    
    <br />
    
    <asp:Label ID="res" runat="server" Text="" />
    
    <br />
    
    <asp:Button ID="login" Text="login" runat="server" OnClick="login_Click"/>
    
    <asp:Button ID="regist" Text="regist" runat="server" OnClick="regist_Click" />
    
    </div>
    
    </form>

    隐藏代码以下 网站

    protected void login_Click(object sender, EventArgs e)
    
    {
    
    this.res.Text = Membership.ValidateUser(this.userId.Value, this.password.Value).ToString();
    
    }
    
       
    
    protected void regist_Click(object sender, EventArgs e)
    
    {
    
    Membership.CreateUser(this.userId.Value, this.password.Value,"123@qq.com");
    
    }

     

       

    有个注意点是添加用户,验证用户时传的密码都是密文,若是须要内部进行验证,则需把enablePasswordRetrieval设成Ture,可是也须要另外的配置,不然配置也会出错。而且密文的加密方式必定要与hashAlgorithmType的加密方式对应。另外一个有疑惑的点是CreateUser(string username, string password)方法调用了会说缺了邮箱,看配置也看不出来有什么办法才能正常调用这个重载。 ui

    先注册一个用户admin / 111(密文aY1RoZ2KEhzlgUmde3AWaA==),能看到表里面多了一条数据

       

    再用试一下认证的方法,文本框输入 admin 和 aY1RoZ2KEhzlgUmde3AWaA==,认证成功。

    另一种提供Provider是须要活动目录(Activity Directory)的,如今对那方面了解不够,很差尝试。

       

    membershipProvider扩展

    建立自定义成员资格提供程序主要有两个缘由。

    • 须要将成员资格信息存储在一个 .NET Framework 内附的成员资格提供程序不支持的数据源中,如 FoxPro 数据库、Oracle 数据库或其余数据源。
    • 须要使用不一样于 .NET Framework 附带的提供程序所使用的数据库架构来管理成员资格信息。一个常见的示例是公司或网站的 SQL Server 数据库中已有的成员资格数据。

    MSDN上有一篇文章通篇展现了一个自定义的MembershipProvider,该MembershipProvider是以Access做为数据源的《如何:演示成员资格提供程序实现》,鄙人模仿也实现了一个MembershipProvider,须要重现的方法和属性比较多,如MSDN文章《实现成员资格提供程序》中所示。鄙人实现的并无真正起到用户管理管理的做用,只是单纯的输出信息到文件中

    public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
    
    {
    
    status = MembershipCreateStatus.Success;
    
    System.IO.File.AppendAllText(@"E:\MemberShip.txt", "CreateUser\r\n");
    
    return GetUser(username, false);
    
    }
    
    public override MembershipUser GetUser(string username, bool userIsOnline)
    
    {
    
    System.IO.File.AppendAllText(@"E:\MemberShip.txt", "MembershipUser GetUser(string username, bool userIsOnline)\r\n");
    
    return new MembershipUser(this.Name,
    
    username,
    
    string.Empty,
    
    string.Empty,
    
    string.Empty,
    
    string.Empty,
    
    false,
    
    false,
    
    DateTime.Now,
    
    DateTime.Now,
    
    DateTime.Now,
    
    DateTime.Now,
    
    DateTime.Now);
    
    }
    
       
    
    public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)
    
    {
    
    System.IO.File.AppendAllText(@"E:\MemberShip.txt", "MembershipUser GetUser(object providerUserKey, bool userIsOnline)\r\n");
    
    return new MembershipUser(this.Name,
    
    providerUserKey.ToString(),
    
    string.Empty,
    
    string.Empty,
    
    string.Empty,
    
    string.Empty,
    
    false,
    
    false,
    
    DateTime.Now,
    
    DateTime.Now,
    
    DateTime.Now,
    
    DateTime.Now,
    
    DateTime.Now);
    
    }
    
    public override bool ValidateUser(string username, string password)
    
    {
    
    System.IO.File.AppendAllText(@"E:\MemberShip.txt", "ValidateUser("+username+","+password+")\r\n");
    
    return username=="liuhf"&&password=="111";
    
    }

     

    这里只展现了部分代码而已,Initialize方法则是粘贴了MSDN上的代码。Web.config配置修改以下

    <membership defaultProvider="sqlProvider" hashAlgorithmType="MD5" userIsOnlineTimeWindow="15" >
    
    <providers>
    
    <clear/>
    
    <add name="sqlProvider" type="FastDoge.Study.MyMembershipProvider2"/>
    
    </providers>
    
    </membership>

     

    WebForm的代码彻底不用修改,运行效果以下

    输入用户名密码注册和登陆,生成的txt文件内容以下

    看写死的代码则知道2222是登陆失败的,上图是登陆成功时的截图,密码111

       

       

    membershipUser扩展

    membershipUser扩展的做用在于想添加自定义的属性。如MSDN上的示例同样,

    publicclass OdbcMembershipUser : MembershipUser
    {
    privatebool _IsSubscriber;
    privatestring _CustomerID;
    
    publicbool IsSubscriber
    {
    get { return _IsSubscriber; }
    set { _IsSubscriber = value; }
    }
    
    publicstring CustomerID
    {
    get { return _CustomerID; }
    set { _CustomerID = value; }
    }
    
    public OdbcMembershipUser(string providername,
    string username,
    object providerUserKey,
    string email,
    string passwordQuestion,
    string comment,
    bool isApproved,
    bool isLockedOut,
    DateTime creationDate,
    DateTime lastLoginDate,
    DateTime lastActivityDate,
    DateTime lastPasswordChangedDate,
    DateTime lastLockedOutDate,
    bool isSubscriber,
    string customerID) :
    base(providername,
    username,
    providerUserKey,
    email,
    passwordQuestion,
    comment,
    isApproved,
    isLockedOut,
    creationDate,
    lastLoginDate,
    lastActivityDate,
    lastPasswordChangedDate,
    lastLockedOutDate)
    {
    this.IsSubscriber = isSubscriber;
    this.CustomerID = customerID;
    }
    
    }

     

    若是想用本身的MembershipUser,必须使用自定义的MembershipProvider才能用上自定义的MembershipUser,对新增长的属性须要存储起来的,那么MembershipProvider中对应的增(MembershipProvider.CreateUser),查(MembershipProvider.GetUser),改(MembershipProvider.UpdateUser)方法也须要修改(用于对新增属性的处理,例如上面的IsSubscriber和CustomerID)。代码仍是偷懒不粘贴了,参考MSDN文章《如何:实现自定义成员资格用户

相关文章
相关标签/搜索