Click here to Skip to main content
Click here to Skip to main content

MySQL Membership, Role, Sitemap, Personalization Provider for ASP.NET 2.0

By , 7 Sep 2007
 

Introduction

This is the implementation of a Membership, Role, Sitemap, and Personalization provider of ASP.NET using MySQL as the backend database. This class uses the native net MySQL Connector version 5.1.2.

Background

This code is based on the work of J Snyman; he used ODBC to connect to MySQL. I modified it to use the native net MySQL Connector version 5.1.2.

Using the code

This is actually a C# class project. You only need to reference the compiled DLL output from this project in your Web project. You can use this even if the language in your web app is VB. The provided compiled DLL can be used right out of the box, but if you prefer, you can compile your own.

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:
  3. 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 a SQL file named DBStructure.sql included with the source code zip file that contains the code above.

  4. Open Visual Studio and create a new Website Project.
  5. Add a reference to Simple.Providers.MySQL.dll.
  6. Make the following changes to your web.config file:
    1. Add the connection string to your newly created database to the connectionStrings section:
    2. <add 
        connectionString="server=localhost;database=simpleproviders;
                          user id=<put user>;pwd=<put password>" 
        name="SimpleProviderconnectionstring" 
        providerName="MySql.Data.MySqlClient"/>

      * Please replace the {Your username} and {Your password} entries in the connection string with your own values.

    3. Under the <system.web> section, add the following:
    4. <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.

  7. 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.

History

  • 9/7/2007 - Uses the MySQL Net Connector 5.1.2 instead of ODBC.

License

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

About the Author

onrac
Web Developer
Philippines Philippines
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
Generalhelp me remove this error.membervirus232 Feb '10 - 1:25 
I have created the MySql table and also edited the web.config as mentioned above.
 
but when I try to run the 'newregister.aspx' file which contains createuserwizard control
the following error is displayed
 
-----------------------------------------------------------------------------------------
Failed to map the path '/'.
 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
 
Exception Details: System.InvalidOperationException: Failed to map the path '/'.
 
Stack Trace:
 
[InvalidOperationException: Failed to map the path '/'.]
System.Web.Configuration.ProcessHostConfigUtils.MapPathActual(String siteName, VirtualPath path) +253
System.Web.Configuration.ProcessHostMapPath.MapPathCaching(String siteID, VirtualPath path) +669
System.Web.Configuration.ProcessHostMapPath.GetPathConfigFilenameWorker(String siteID, VirtualPath path, String& directory, String& baseName) +19
System.Web.Configuration.ProcessHostMapPath.System.Web.Configuration.IConfigMapPath.GetPathConfigFilename(String siteID, String path, String& directory, String& baseName) +37
System.Web.Configuration.HostingPreferredMapPath.GetPathConfigFilename(String siteID, String path, String& directory, String& baseName) +75
System.Web.Configuration.WebConfigurationHost.GetStreamName(String configPath) +8845430
System.Configuration.Internal.DelegatingConfigHost.GetStreamName(String configPath) +13
System.Configuration.BaseConfigurationRecord.InitConfigFromFile() +154
 
[ConfigurationErrorsException: An error occurred loading a configuration file: Failed to map the path '/'.]
System.Configuration.ConfigurationSchemaErrors.ThrowIfErrors(Boolean ignoreLocal) +650948
System.Configuration.BaseConfigurationRecord.ThrowIfParseErrors(ConfigurationSchemaErrors schemaErrors) +31
System.Configuration.Configuration..ctor(String locationSubPath, Type typeConfigHost, Object[] hostInitConfigurationParams) +356
System.Configuration.Internal.InternalConfigConfigurationFactory.System.Configuration.Internal.IInternalConfigConfigurationFactory.Create(Type typeConfigHost, Object[] hostInitConfigurationParams) +29
System.Web.Configuration.WebConfigurationHost.OpenConfiguration(WebLevel webLevel, ConfigurationFileMap fileMap, VirtualPath path, String site, String locationSubPath, String server, String userName, String password, IntPtr tokenHandle) +775
System.Web.Configuration.WebConfigurationManager.OpenWebConfigurationImpl(WebLevel webLevel, ConfigurationFileMap fileMap, String path, String site, String locationSubPath, String server, String userName, String password, IntPtr userToken) +84
System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(String path) +36
Simple.Providers.MySQL.MysqlMembershipProvider.Initialize(String name, NameValueCollection config) in C:\ONRAC\CSPROJ\MySqlProv\MysqlMembershipProvider.cs:163
System.Web.Configuration.ProvidersHelper.InstantiateProvider(ProviderSettings providerSettings, Type providerType) +592
System.Web.Configuration.ProvidersHelper.InstantiateProviders(ProviderSettingsCollection configProviders, ProviderCollection providers, Type providerType) +126
System.Web.Security.Membership.Initialize() +1569
System.Web.UI.WebControls.LoginUtil.GetProvider(String providerName) +35
System.Web.UI.WebControls.CreateUserWizard.get_QuestionAndAnswerRequired() +93
System.Web.UI.WebControls.CreateUserWizard.UpdateValidators() +580
System.Web.UI.WebControls.CreateUserWizard.CreateChildControls() +33
System.Web.UI.Control.EnsureChildControls() +87
System.Web.UI.WebControls.Wizard.OnInit(EventArgs e) +90
System.Web.UI.Control.InitRecursive(Control namingContainer) +333
System.Web.UI.Control.InitRecursive(Control namingContainer) +210
System.Web.UI.Control.InitRecursive(Control namingContainer) +210
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +6741
System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +242
System.Web.UI.Page.ProcessRequest() +80
System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context) +21
System.Web.UI.Page.ProcessRequest(HttpContext context) +49
ASP.new_user_aspx.ProcessRequest(HttpContext context) +37
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +181
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75
 

-----------------------------------------------------------------------------------------
 

 

 

Is there something wrong the applicationpath.I have set the applicationpath="project"
 
or
 
Is there something wrong with the reference of the .DLL file.
 
I have placed the "ccmMyProvClass" folder inside the '\Visual Studio 2008\WebSites' folder ,which contains 'project' folder in which there is newregister.aspx file.
 
or
 
Is something else missing Confused | :confused: Confused | :confused: Confused | :confused: Confused | :confused:
 
Please help me solve this problem,I am new in asp.net any suggestions will be helpful.
QuestionHow do the Simple Providers recognize the current version of MySQL Connector DrivermemberLuizItatiba8 Sep '09 - 17:34 
How do I recognize the Simple.Providers.MySql Connector MySqlConnector version 6.1.2 as the latest one is this link that has tried to remove the reference to MySql.Data version and place it now and do rebuild the DLL to generate it gives error
 
The error it gives is
 
Error     1     The type 'System.Xml.Serialization.IXmlSerializable' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.     C:\ComponentesDLL\MySqlSiteMapProvider\Simple.Providers.MySQL_Source\Simple.Providers.MySQL\RawDBQuery.cs     9     31     Simple.Providers.MySQL
 
Here the link of the current version of the connector
 
<a href="http://dev.mysql.com/downloads/connector/net/6.1.html" target="blank">MySqlConnector 6.1.2</a>
 
I'm using VS2005 to try to rebuild but not working there would be some link with the SimpleProvider because of MySqlSiteMap with the new version of the connector?
 
I am in the look and I thank you
 
LADEF

QuestionRe: WebpartsmemberMember 41156042 Apr '09 - 13:27 
This works fine, as long as you only want to move one part around the screen. Let me explain I set up two columns with more than one webpart on the right hand side column, and moved webparts from the right to the left. When I move the first webpart, it moves fine, however when I move a second, the first webpart is replaced by the webpart I am moving. Before, It's my code is uttered I ran the same code with the SQL form authentication and the web parts move find. If you can help I would appreciate your comments.
 
Regards,
 
Martin Wink | ;)
QuestionHow CurrentNodes and accented with spaces in SiteMapPath? For example São Paulo-SP.memberLuizItatiba22 Oct '08 - 9:25 
Onrac you could you explain why when I use a control-type sitemappath in currentnode, I explain what's happening
 
well let me explain you better then
 
My SiteMapProvider comes from below as MySqlSiteMapProvider

&lt;!-- INÖCIO CONFIGS MYSQLSITEMAPPROVIDER --&gt;
&lt;siteMap defaultProvider="siteMapProvider" enabled="true"&gt;
 
&lt;providers&gt;
&lt;clear /&gt;
 
&lt;add name="siteMapProvider"
 
type="Simple.Providers.MySQL.MysqlSiteMapProvider"
 
connectionStringName="SimpleProviderConnectionString"
 
applicationName="myapp"
 
description="MySQL site map provider"
 
securityTrimmingEnabled="true"/&gt;
&lt;/providers&gt;
 
&lt;/siteMap&gt;

 
&lt;!-- FIM CONFIGS MYSQL SITEMAPPROVIDER --&gt;
 
When the url it in my database in the field url MySqlSiteMapProvider is like this

id, myapp, 'Atibaia-SP.', 'shops - Atibaia-SP.', 'shops.aspx?subsessao=books&amp;cidade=atibaia&amp;uf=sp', '', parentid

it shows SiteMapPath in control of my application correctly or

Home :shops : books : Atibaia-SP.

Now when the data comes from my database of mysqlsitemapprovider that way

id, myapp, 'São Paulo-SP.', 'shops - São Paulo-SP.', 'shops.aspx?subsessao=books&amp;cidade=são paulo&amp;uf=sp', '', parentid

or

id, myapp, 'Jundiaí-SP.', 'shops - Jundia-SP.', 'shops.aspx?subsessao=books&amp;cidade=´jundiaí&amp;uf=sp', '', parentid

it just shows me this result in the control mode of execution in SiteMapPath

Home : shops

if you can help me now because I need to thank the currentnode, finally on all nodes that the accented characters with spaces and mapped by MySqlSiteMapProvider appear with accents and spaces in control sitemappath
 
LADEF

QuestionHow to correctly set the standard MemberShipProvider Provider of the SqlServer2005 to work together with the MySqlSiteMapProvider?memberLuizItatiba8 Oct '08 - 6:26 
Hello onrac as can be seen in the web.config of my asp.net 2.0 application that I am doing in VisualStudio2005 I have a 2 providers SqlSiteMapProvider which is the standard for use with authentication and security based on MemberShipProvider and another to use only the MySqlSiteMapProvider who also uses Roles of the MemberShipProvider the standard SQLServer as can be seen below in web.config
 

 
<appSettings/>
 
      <connectionStrings>
 
            
 
            <add name="MembershipConnection" connectionString="Data Source=mydatasource;Initial Catalog=mydb;User ID=sa;Password=mypass"  providerName="System.Data.SqlClient"/>
 
            <add connectionString="server=mysqlserver;database=mybd;user id=myid;pwd=mypass" name="SimpleProviderConnectionString" providerName="MySql.Data.MySqlClient"/>
 
      </connectionStrings>
 
  <system.web>
 
        <membership defaultProvider="SqlProvider" userIsOnlineTimeWindow="15">
 
              <providers>
 
                    <clear/>
 
                    <add name="SqlProvider" type="System.Web.Security.SqlMemberShipProvider"
 
                           connectionStringName="MembershipConnection"/>           
 
              </providers>    
 
              
 
        </membership>
 
        <!-- INÍCIO CONFIGS MYSQLSITEMAPPROVIDER -->
 
        <siteMap defaultProvider="siteMapProvider" enabled="true">
 
 
 
              <providers>
 
                    <clear />
 
                    <add name="siteMapProvider"
 
                         type="Simple.Providers.MySQL.MysqlSiteMapProvider"
 
                         connectionStringName="SimpleProviderConnectionString"
 
                         applicationName="myapp"
 
                         description="MySQL site map provider"
 
                         securityTrimmingEnabled="true"/>
 
              </providers>
 
 
 
        </siteMap>
 
 
 
        <authentication mode="Forms">
 
                   
 
        </authentication>
 

 

 
What you need to know is how to properly configure so that the two providers one for each state are recognized and work properly in my webapplication Project and how to ensure that the roles created Membership in the SQL are recognized in MySqlSiteMapProvider too.
 
If you can help me now thank you
 
Translated from Portuguese to English by Google
 
LADEF

QuestionHow can I use same database for more than one application?memberUmut TURER2 Sep '08 - 6:39 
I am using MySQL membership provider for my web applications.
And I want to use same membership database for more than one application.
It works fine when storing information. Created users in each application is stored related to that application's name.
However when logging in, any valid user from any application can log in even that username does not belong to that application.
 
My question arise at this point. Is there a way that mysql membership provider can handle this situation by its own?
 
Any help is appreciated..
 
Oncel Umut TURER
QuestionCan someone provide the same example with some aspx pages.....memberMember 358658015 Jul '08 - 23:20 
It is nice article No Doubt.
but anyone can help me how i integrate this to the actual asp website files.
GeneralgoodmemberDidier Stmedar4 Jul '08 - 3:33 
good attempt for custom providers maybe you could have normalise your database first.
 
Didier
QuestionFail to test to the provider in the Asp.net ConfigurationmemberCGARRIGOS20 May '08 - 1:54 
I have changed the names of the following tables
table users by aspnet_Users
table roles by aspnet_Roles
table usersinroles by aspnet_UsersInRolesñ
Actually run the management of roles and users, but I don't get to test the provider after the new names of table.
If somebody knows the answer I agree his answer.
Thanks
QuestionHow to Order Alphabetically by the children MySqlSiteMapProvider usmemberLuizItatiba1 Apr '08 - 16:30 
As the Order Alphabetically by MySqlSiteMapProvider us children, or qdo I add an item on the menu I would like the Parent Title him he was Sorted Alphabetically or is not
 
you can help me now thank you
 
LADEF

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web01 | 2.6.130523.1 | Last Updated 8 Sep 2007
Article Copyright 2007 by onrac
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid