Click here to Skip to main content
5,790,650 members and growing! (18,802 online)
Email Password   helpLost your password?
Web Development » ASP.NET Controls » General     Intermediate License: The Code Project Open License (CPOL)

Suite of MySQL Provider Implementations for ASP.NET 2.0

By J Snyman

An Article on Implementing MySQL Providers for ASP.NET 2.0 Membership, Roles, Site Map and Personalization
C#, Windows, .NET, .NET 2.0, MySQL, IIS, Visual Studio, ASP.NET, WebForms, Dev

Posted: 26 Apr 2007
Updated: 22 Oct 2007
Views: 64,280
Bookmarked: 77 times
Announcements
Loading...



Search    
Advanced Search
Sitemap
32 votes for this Article.
Popularity: 6.14 Rating: 4.08 out of 5
4 votes, 12.5%
1
0 votes, 0.0%
2
0 votes, 0.0%
3
3 votes, 9.4%
4
25 votes, 78.1%
5

Contents

Introduction

As I started to work on a new AJAX-enabled website, I looked around for a MySQL implementation of the ASP.NET 2.0 membership provider. To my amazement, I couldn't find anything. So I decided to do my own implementation. After a few days of dev work, on and off, I found that I hadn't only implemented the membership provider but also the roles provider, site map provider and personalization provider.

All the providers inherit from the generic providers from Microsoft.

[^]

Using the Code

Using the providers is really easy.

  1. Create a new database on your MySQL server, e.g. SimpleProviders.

  2. Execute the following SQL statement on the newly created database.

    CREATE TABLE `personalization` (
      `username` varchar(255) default NULL,
      `path` varchar(255) default NULL,
      `applicationname` varchar(255) default NULL,
      `personalizationblob` blob
    );
    
    CREATE TABLE `profiles` (
      `UniqueID` int(8) NOT NULL auto_increment,
      `Username` varchar(255) NOT NULL default '',
      `ApplicationName` varchar(255) NOT NULL default '',
      `IsAnonymous` tinyint(1) default '0',
      `LastActivityDate` datetime default NULL,
      `LastUpdatedDate` datetime default NULL,
      PRIMARY KEY  (`UniqueID`),
      UNIQUE KEY `PKProfiles` (`Username`,`ApplicationName`),
      UNIQUE KEY `PKID` (`UniqueID`)
    );
    
    CREATE TABLE `roles` (
      `Rolename` varchar(255) NOT NULL default '',
      `ApplicationName` varchar(255) NOT NULL default '',
      PRIMARY KEY  (`Rolename`,`ApplicationName`)
    );
    
    CREATE TABLE `sitemap` (
      `ID` int(11) NOT NULL auto_increment,
      `ApplicationName` varchar(255) NOT NULL default '',
      `Title` varchar(255) default NULL,
      `Description` text,
      `Url` text,
      `Roles` text,
      `Parent` int(11) default NULL,
      PRIMARY KEY  (`ID`)
    );
    
    CREATE TABLE `users` (
      `PKID` varchar(255) NOT NULL default '',
      `Username` varchar(255) NOT NULL default '',
      `ApplicationName` varchar(255) NOT NULL default '',
      `Email` varchar(128) default NULL,
      `Comment` varchar(255) default NULL,
      `Password` varchar(128) NOT NULL default '',
      `FailedPasswordAttemptWindowStart` datetime default NULL,
      `PasswordQuestion` varchar(255) default NULL,
      `IsLockedOut` tinyint(1) default '0',
      `PasswordAnswer` varchar(255) default NULL,
      `FailedPasswordAnswerAttemptCount` int(8) default '0',
      `FailedPasswordAttemptCount` int(8) default '0',
      `IsApproved` tinyint(1) NOT NULL default '0',
      `FailedPasswordAnswerAttemptWindowStart` datetime default NULL,
      `LastActivityDate` datetime default NULL,
      `IsOnLine` tinyint(1) default '0',
      `CreationDate` datetime default NULL,
      `LastPasswordChangedDate` datetime default NULL,
      `LastLockedOutDate` datetime default NULL,
      `LastLoginDate` datetime default NULL,
      PRIMARY KEY  (`PKID`),
      UNIQUE KEY `PKID` (`PKID`),
      KEY `PKID_2` (`PKID`),
      KEY `usr` (`Username`)
    );
    
    CREATE TABLE `usersinroles` (
      `Username` varchar(255) NOT NULL default '',
      `Rolename` varchar(255) NOT NULL default '',
      `ApplicationName` varchar(255) NOT NULL default '',
      PRIMARY KEY  (`Username`,`Rolename`,`ApplicationName`)
    );

    There is an SQL file named DBStructure.sql included with the source code ZIP file that contains the code above.

  3. Open Visual Studio and create a new Website Project.

  4. Add a reference to the Simple.Providers.MySQL.dll file.

  5. Make the following changes to your web.config file:

    1. Add the connection string to your newly created database to the connectionStrings section, e.g. <add connectionstring="Driver={MySQL ODBC 3.51 Driver};server={Your Server IP};port={Your Server Port No.};option=3;database={New Database Name};uid={Your username};pwd={Your password}" name="SimpleProviderConnectionString" providername="System.Data.Odbc" />.

      * Please replace the {Your Server IP}, {Your Server Port No.}, {New Database Name}, {Your username} and {Your password} entries in the connection string with your own values.

    2. Under the <system.web> section add the following:

      <siteMap defaultProvider="siteMapProvider" enabled="true">
      
          <providers>
              <clear />
              <add name="siteMapProvider" 
                 type="Simple.Providers.MySQL.MysqlSiteMapProvider" 
                 connectionStringName="SimpleProviderConnectionString" 
                 applicationName="{Your App Name}" 
                 description="MySQL site map provider" 
                 securityTrimmingEnabled="true"/>
          </providers>
      </siteMap>
      <roleManager defaultProvider="roleProvider" enabled="true" 
          cacheRolesInCookie="false" cookieName=".ASPROLES" 
          cookieTimeout="7200" cookiePath="/" cookieRequireSSL="false" 
          cookieSlidingExpiration="true" cookieProtection="All">
          <providers>
      
              <clear />
              <add name="roleProvider" 
                  type="Simple.Providers.MySQL.MysqlRoleProvider" 
                  connectionStringName="SimpleProviderConnectionString" 
                  applicationName="{Your App Name}" 
                  description="MySQL role provider"/>
          </providers>
      </roleManager>
      <membership defaultProvider="membershipProvider" 
          userIsOnlineTimeWindow="15">
          <providers>
              <clear />
      
              <add name="membershipProvider" 
                  type="Simple.Providers.MySQL.MysqlMembershipProvider" 
                  connectionStringName="SimpleProviderConnectionString" 
                  applicationName="{Your App Name}" 
                  enablePasswordRetrieval="true" 
                  enablePasswordReset="true"
                  requiresQuestionAndAnswer="true" 
                  requiresUniqueEmail="true" passwordFormat="Encrypted" 
                  minRequiredPasswordLength="6" 
                  minRequiredNonalphanumericCharacters="0"  
                  description="MySQL membership provider"/>
          </providers>
      </membership>
      <profile defaultProvider="profileProvider" 
          automaticSaveEnabled="true">
          <providers>
              <clear />
              <add name="profileProvider" 
                  type="Simple.Providers.MySQL.MysqlProfileProvider" 
                  connectionStringName="SimpleProviderConnectionString" 
                  applicationName="{Your App Name}" 
                  description="MySQL Profile Provider"/>
      
          </providers>
          <properties>
              <clear />
              <!--
                  Add any needed attributes for profiles here.
                  eg. <add name="Theme" type="System.String" 
                          defaultValue="Default"/>
              -->
          </properties>
      
      </profile>
      <webParts>
          <personalization defaultProvider="personalizationProvider">
              <providers>
                  <clear />
                  <add name="personalizationProvider" 
                      type="Simple.Providers.MySQL.
                      MysqlPersonalizationProvider" 
                      connectionStringName=
                      "{Your Connection String Name}" applicationName="
                      {Your App Name}" 
                      description="MySQL Personalization Provider/>
              </providers>
      
          </personalization>
      </webParts> 
      
      /* !!! Please replace the {Your App Name} instances with a valid 
      application name. The application name should not contain 
      any spaces or special characters. !!! */
  6. Everything should be set up correctly now. Continue with the rest of your project and make sure to make use of the features provided by the above mentioned providers.

[^]

Points of Interest

I made use of the Microsoft MSDN site while developing the provider suite. For more info on...

[^]

History

  • 2007-04-25: Initial release of the article
  • 2007-10-18: Update of the UpdateUser code to enable LastActivityDate functionality
[^]

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

J Snyman


Jacques Snyman is an Analyst Developer from Midrand, South Africa. He has developed numerous entreprise applications using C#, VB.Net, Java and various other languages.

His hobbies include programming, cricket, blogging (on JacquesSnyman.co.za) and a fair bit of reading (mostly on developent).

Recently he has started to shift his focus towards the open source PBX technologies. In particular, Asterisk. Voice recognition continues to be his unicorn.
Occupation: Web Developer
Location: South Africa South Africa

Other popular ASP.NET Controls articles:

Article Top
Sign Up to vote for this article
You must Sign In to use this message board.
FAQ FAQ Noise ToleranceSearch Search Messages 
 Layout  Per page   
 Msgs 1 to 25 of 109 (Total in Forum: 109) (Refresh)FirstPrevNext
GeneralOnly passwordFormat = "Clear" is accepted.memberMichael Dolittle12:07 15 Nov '08  
GeneralRe: Only passwordFormat = "Clear" is accepted.memberJ Snyman19:20 16 Nov '08  
GeneralBecause in Asp.Net website he does not recognize the Web.config of the MySqlSiteMapProvider ApplicationNamememberLuizItatiba15:02 11 Nov '08  
GeneralRe: Because in Asp.Net website he does not recognize the Web.config of the MySqlSiteMapProvider ApplicationNamememberJ Snyman22:44 12 Nov '08  
AnswerRe: Because in Asp.Net website he does not recognize the Web.config of the MySqlSiteMapProvider ApplicationNamememberLuizItatiba5:38 13 Nov '08  
QuestionHow CurrentNodes and accented with spaces in SiteMapPath? For example São Paulo-SP.memberLuizItatiba10:23 22 Oct '08  
AnswerRe: How CurrentNodes and accented with spaces in SiteMapPath? For example São Paulo-SP.memberJ Snyman10:30 22 Oct '08  
QuestionHow to correctly set the standard MemberShipProvider Provider of the SqlServer2005 to work together with the MySqlSiteMapProvider?memberLuizItatiba7:04 8 Oct '08  
Generalspeed problemsmemberpeteresorensen3:44 8 Aug '08  
GeneralRe: speed problemsmemberJ Snyman3:51 8 Aug '08  
GeneralMySQL/Net Connectormemberpeteresorensen4:07 8 Aug '08  
GeneralRe: MySQL/Net ConnectormemberJ Snyman22:40 10 Aug '08  
GeneralRe: MySQL/Net Connectormemberpeteresorensen23:36 10 Aug '08  
GeneralMembershipProvider passwordFormat Encrypted/Hashed Errormemberfpajaro10:03 11 Jun '08  
QuestionSo near, and yet....memberRoss Holland12:11 25 May '08  
AnswerRe: So near, and yet....memberJ Snyman20:06 25 May '08  
GeneralRe: So near, and yet....memberRoss Holland22:18 25 May '08  
GeneralRe: So near, and yet....memberJ Snyman22:26 25 May '08  
Generalhelp me :((memberDasty1:57 18 Apr '08