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文章《如何:實現自定義成員資格用戶

相關文章
相關標籤/搜索