membership成員資格是ASP.NET 成員資格爲您提供了一種驗證和存儲用戶憑據的內置方法。所以,ASP.NET 成員資格可幫助您管理網站中的用戶身份驗證。它包含如下功能 web
它其實是一個系統中用戶管理的一部分(大體包含用戶密碼驗證,用戶的增刪改查,可是用戶的信息——即用戶類的屬性是固定的)。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擴展
建立自定義成員資格提供程序主要有兩個緣由。
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文章《如何:實現自定義成員資格用戶》