
Membership它们用的是ASPNETDB这个数据库,但我们可以使用我们自定义的数据库,然而除非我们自定义的数据库有着跟这个ASPNETDB一样的模式,否则ASP.NET提供的默认的SqlMembershipProvider将无法被使用。也就是说,如果我们还要用ASP.NET提供的SqlMembershipProvider,我们就必须ASPNETDB这个数据库文件或是它的拷贝。明显,这不是我们要的。为此,若我们使用了自定义的数据库(而非ASPNETDB的拷贝),那么我们就必须写自己的MembershipProvider。步骤如下。1,定义好自己的数据库,此例中为TestDB01。在我的TestDB01下有一表UserInfo,其下有字段UserID,UserName,UserAge。2,写自己的MembershipProvider,这个类继承自命名空间System.Web.Security下的MembershipProvider类。这一步很简单,创建一个空类,举例名为MyMembershipProvider,技术上说我们可以把它放在应用程序的任何位置,但我把它放在了项目下的一个名为Infrastructure(自己加的)的文件夹下。这一步的初始代码形式大概如下:namespace MvcApplication5.Infrastructure{ public class MyMembershipProvider : System.Web.Security.MembershipProvider/*我把命名空间写这了*/ { }}当然,它是空的,它需要我们往里面再加一些东西。。此时我们把光标放到“System.Web.Security.MembershipProvider”上并右击鼠标,在弹出的下拉框上我们可以看到“实现虚拟类”(我用的是英文版,我不知道有没有翻译对,原内容是“Emplement Abstract Class”),单击这一选项我们的MyMembershipProvider这个类顿时多了N多个方法,此时它的形式如下(我只截了一部分): public class MyMembershipProvider : System.Web.Security.MembershipProvider { public override string ApplicationName { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } } public override bool ChangePassword(string username, string oldPassword, string newPassword) { throw new NotImplementedException(); } //... public override bool ValidateUser(string username, string password) { throw new NotImplementedException(); } }可以看到,这些方法什么都没做,除了抛出一个NotImplementedException异常。当然,这不是我们希望的,这些方法需要我们自己去填充,要不然怎么叫“自定义”呢。。呃,现在先把我们先不管别的方法,只看最后的这个ValidateUser()方法。顾名思义,这个正是我们用来验证用户的方法,对其修改如下: public override bool ValidateUser(string username, string password) { SqlConnection sqlconn = new SqlConnection("Data Source=HCNG-PC;Initial Catalog=TestDB01;Integrated Security=True");/*用你的数据源名替换HCNG-PC,且TestDB01是我用来测试的自定义数据库*/ SqlCommand sqlcmd = new SqlCommand("select UserID, UserName from [UserInfo] where UserName = @userName and UserAge = @userAge", sqlconn);/*这些相信你都明白,若有不明,请补充问题*/ try { sqlconn.Open(); sqlcmd.Parameters.Add(new SqlParameter("@userName", SqlDbType.NVarChar, 50)); sqlcmd.Parameters["@userName"].Value = username.Trim(); sqlcmd.Parameters.Add(new SqlParameter("@userAge", SqlDbType.SmallInt, 2)); sqlcmd.Parameters["@userAge"].Value = password; SqlDataReader sqlRd = sqlcmd.ExecuteReader(); if (sqlRd.HasRows) { return true; } return false; } catch (Exception ex) { throw new Exception(ex.Message); } }至此,我们的自定义MembershipProvider算是完成。3,配置web.config。把此配置文件下的
