Reputation: 4559
I've read several posts in this forum about this but nothing seems to work. I'm trying to replace the default SQL Server based providers with MySQL providers using the latest version of connector (6.3.6.0) and VS2010, but I keep getting an error when accessing the Security section in WSAT. Here are my steps:
1) create a new mysql database. 2) create a new MVC2 application. 3) change web.config as follows:
<connectionStrings>
<remove name="LocalMySqlServer"/>
<add name="LocalMySqlServer"
connectionString="Data Source=127.0.0.1;Port=3306;Database=Sample;User id=root;Password=mysql;"
providerName="MySql.Data.MySqlClient"/>
<remove name="ApplicationServices"/>
<add name="ApplicationServices"
connectionString="Data Source=127.0.0.1;Port=3306;Database=Sample;User id=root;Password=mysql;"
providerName="MySql.Data.MySqlClient" />
</connectionStrings>
...
<membership defaultProvider="MySqlMembershipProvider">
<providers>
<clear/>
<add name="MySqlMembershipProvider" type="MySql.Web.Security.MySQLMembershipProvider,MySql.Web,Version=6.3.6.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d"
connectionStringName="MySqlMembershipConnection"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="false"
requiresUniqueEmail="true"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="6"
minRequiredNonalphanumericCharacters="0"
passwordAttemptWindow="10"
applicationName="/"
autogenerateschema="true"/>
</providers>
</membership>
<profile>
<providers>
<clear/>
<add type="MySql.Web.Profile.MySQLProfileProvider, MySql.Web, Version=6.3.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"
name="MySqlProfileProvider"
applicationName="/"
connectionStringName="MySqlMembershipConnection"
autogenerateschema="true"/>
</providers>
</profile>
<roleManager enabled="true" defaultProvider="MySqlRoleProvider">
<providers>
<clear />
<add connectionStringName="MySqlMembershipConnection"
applicationName="/"
name="MySqlRoleProvider"
type="MySql.Web.Security.MySQLRoleProvider,MySql.Web,Version=6.3.6.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d"
autogenerateschema="true"/>
</providers>
</roleManager>
<machineKey validationKey="AutoGenerate" validation="SHA1"/>
When I run WSAT and click Security, I get this error:
There is a problem with your selected data store. This can be caused by an invalid server name or credentials, or by insufficient permission. It can also be caused by the role manager feature not being enabled. Click the button below to be redirected to a page where you can choose a new data store.
The following message may help in diagnosing the problem: The source was not found, but some or all event logs could not be searched. To create the source, you need permission to read all event logs to make sure that the new source name is unique. Inaccessible logs: Security.
Could anyone tell me what's wrong with this procedure? Thanks to all!
Upvotes: 0
Views: 2302
Reputation: 4559
finally I got it working and I'd like to share the information here. I am using the latest version of Connector/Net (6.3.6) in an ASP.NET MVC 2 website. Here is what I did:
1) create a new MySql database (or just use yours if any).
2) ensure that your machine.config has enabled schema autogeneration for MySQLMembershpProvider. As you probably know, machine.config is typically placed under c:\windows\microsoft.net\framework[version]\config\machine.config. Find under the entry for MySQLMembershipProvider and append the attribute autogenerateschema="true" to the element . The whole element will look like this:
<add name="MySQLMembershipProvider" type="MySql.Web.Security.MySQLMembershipProvider, MySql.Web, Version=6.3.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" connectionStringName="LocalMySqlServer" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" applicationName="/" requiresUniqueEmail="false" passwordFormat="Clear" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="1" passwordAttemptWindow="10" passwordStrengthRegularExpression="" autogenerateschema="true"/>
3) in your web.config (I'm referring to a newly created web application, so make your changes if required) change the connection strings and providers so that they refer to MySql. Typically: under connectionStrings add:
<remove name="ApplicationServices"/>
<add name="ApplicationServices" connectionString=connectionString="server=YOURSERVER;UserId=YOURUSER;password=YOURPASSWORD;Persist Security Info=True;database=YOURDATABASE;charset=utf8" providerName="MySql.Data.MySqlClient"/>
(BTW, notice the charset=utf8 in the connection string: this is not required for membership, but it is required if you are going to use this connection string to exchange Unicode data: it is not enough to just define the character set in your MySql table fields!).
Also, under membership / providers... ensure that the membership provider element (typically something like add name="AspNetSqlMembershipProvider"...) connectionStringName attribute refers to the connection string you set above (in my case, connectionStringName="ApplicationServices"). Do the same for profile and roleManager providers, which should look like this:
<profile>
<providers>
<clear/>
<add type="MySql.Web.Profile.MySQLProfileProvider, MySql.Web, Version=6.3.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"
name="AspNetSqlProfileProvider"
applicationName="/"
connectionStringName="ApplicationServices"
autogenerateschema="true"/>
</providers>
</profile>
<roleManager enabled="true" defaultProvider="MySqlRoleProvider">
<providers>
<clear />
<add connectionStringName="ApplicationServices"
applicationName="/"
name="MySqlRoleProvider"
type="MySql.Web.Security.MySQLRoleProvider,MySql.Web,Version=6.3.6.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d"
autogenerateschema="true"/>
</providers>
</roleManager>
<machineKey validationKey="AutoGenerate" validation="SHA1"/>
(Note the SHA1 validation!).
4) launch WSAT from Visual Studio and let it configure your MySql database. It should create all the tables required and let you create users and assign roles. Beware of table names casing! With WSAT tables like myaspnet_Users (not myaspnet_users) are created, and this might lead to confusions (MySQL Workbench seems to be confused by this and will show you just 1 table if you have 2 tables with their names differing only by casing. Tools like Navicat seem smarter in this respect). It's best to let WSAT create its tables to avoid this fuss.
Finally, remember that if you are going to use my_aspnet... tables in some relationships, you must make sure you select the proper MySQL database engine, i.e. not MyISAM but InnoDB, otherwise your foreign keys even if set will be ignored.
That's all I can share for this issue. Hope this might save some hours to someone else...
Upvotes: 1
Reputation: 4559
Perhaps I found the culprit: the PC I was working today had not its machine.config (for .net 4) configuration set for autogenerateschema="true" (btw there is a typo in my code above, the connection string name is not correct, but this happened only by copy/paste in my post). So maybe this is useful for all the newcomers like me: remember to set autogenerateschema="true" in
Thanks anyway
Upvotes: 0