在ASP.NET框架中,Microsoft提供了Membership提供程序,但仅限于SQL Server。对于使用MySQL数据库的用户来说,这可能不够方便。因此,本文将介绍如何基于ODBC提供程序的示例代码,为ASP.NET v2.0编写自定义的MySQLMembership和Role Provider。
要使用这些自定义类,需要最新的MySQL.NET Connector。可能需要使用v2.0的C#编译器重新编译它,但通常情况下,新框架应该支持v1.0或1.1的程序集。
请注意,以下SQL命令可能不适用于MySQL4。
CREATE TABLE Roles (
Rolename VARCHAR(255) NOT NULL,
ApplicationName varchar(255) NOT NULL
);
CREATE TABLE UsersInRoles (
Username VARCHAR(255) NOT NULL,
Rolename VARCHAR(255) NOT NULL,
ApplicationName Text(255) NOT NULL
);
ALTER TABLE 'usersinroles' ADD INDEX ('Username', 'Rolename', 'ApplicationName');
ALTER TABLE 'roles' ADD INDEX ('Rolename', 'ApplicationName');
CREATE TABLE 'users' (
'PKID' varchar(36) collate latin1_general_ci NOT NULL default '',
'Username' varchar(255) collate latin1_general_ci NOT NULL default '',
'ApplicationName' varchar(100) collate latin1_general_ci NOT NULL default '',
'Email' varchar(100) collate latin1_general_ci NOT NULL default '',
'Comment' varchar(255) collate latin1_general_ci default NULL,
'Password' varchar(128) collate latin1_general_ci NOT NULL default '',
'PasswordQuestion' varchar(255) collate latin1_general_ci default NULL,
'PasswordAnswer' varchar(255) collate latin1_general_ci default NULL,
'IsApproved' tinyint(1) default NULL,
'LastActivityDate' datetime default NULL,
'LastLoginDate' datetime default NULL,
'LastPasswordChangedDate' datetime default NULL,
'CreationDate' datetime default NULL,
'IsOnLine' tinyint(1) default NULL,
'IsLockedOut' tinyint(1) default NULL,
'LastLockedOutDate' datetime default NULL,
'FailedPasswordAttemptCount' int(11) default NULL,
'FailedPasswordAttemptWindowStart' datetime default NULL,
'FailedPasswordAnswerAttemptCount' int(11) default NULL,
'FailedPasswordAnswerAttemptWindowStart' datetime default NULL,
PRIMARY KEY ('PKID')
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
将MySqlMembershipProvider::encryptionKey更改为选择的随机十六进制值。
将这两个文件上传到~/App_Code目录下。
使用以下模板修改web.config(如果在共享主机服务器上,可能需要将writeExceptionsToEventLog设置为false)。
<connectionStrings>
<add name="ConnString" connectionString="Database=YOURDBNAME;Data Source=localhost;User Id=YOURUSERNAME;Password=YOURPWD"/>
</connectionStrings>
<system.web>
<roleManager defaultProvider="MySqlRoleProvider" enabled="true" cacheRolesInCookie="true" cookieName=".ASPROLES" cookieTimeout="30" cookiePath="/" cookieRequireSSL="false" cookieSlidingExpiration="true" cookieProtection="All">
<providers>
<clear/>
<add name="MySqlRoleProvider" type="Andri.Web.MySqlRoleProvider" connectionStringName="ConnString" applicationName="YOURAPPNAME" writeExceptionsToEventLog="true"/>
</providers>
</roleManager>
<membership defaultProvider="MySqlMembershipProvider" userIsOnlineTimeWindow="15">
<providers>
<clear/>
<add name="MySqlMembershipProvider" type="Andri.Web.MySqlMembershipProvider" connectionStringName="ConnString" applicationName="YOURAPPNAME" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" requiresUniqueEmail="true" passwordFormat="Hashed" writeExceptionsToEventLog="true"/>
</providers>
</membership>
</system.web>