Bug #34451 mySQL Connector/NET breaks Membership Provider List.
Submitted: 10 Feb 2008 23:40 Modified: 1 Mar 2008 11:21
Reporter: Paulo Santos
Status: Closed
Category:Connector/Net Severity:S2 (Serious)
Version:5.2.0 OS:Microsoft Windows
Assigned to: Target Version:
Tags: Profile Provider, Roles Provider, Membership Provider

[10 Feb 2008 23:40] Paulo Santos
Description:
After installing the Connector on a machine whitout the mySQL installed the membership
provider system on installed websites break.

The problem is caused by the fact that the connection string on the machine.config that
the setup process updates is empty, because the machine in question does not have mYSQL
installed.

======== Error message ========

Configuration Error 
Description: An error occurred during the processing of a configuration file required to
service this request. Please review the specific error details below and modify your
configuration file appropriately. 

Parser Error Message: Error during provider initialization.

Source Error: 

Line 146:        <add name="MySQLMembershipProvider"
type="MySql.Web.Security.MySQLMembershipProvider, MySql.Web, Version=5.2.0.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="" />

How to repeat:
On a machine without mySQL install the mySQL Connector/NET and access any website hostaed
by the refered machine that uses the Membership Provider system.

Suggested fix:
There are two possible solutions:

1. Change the setup to ask for the desired mySQL box and update the connection string
accordingly

2. Patch the initialization procedure on MySQLMemebershipProvider.Initialize,
MySQLProfileProvider.Initialize and MySQLRoleProvider.Initialize to exit after checking if
the connection string is empty.
[14 Feb 2008 21:14] Reggie Burnett
I don't understand the problem here.  The installer creates a dummy connection string
simply because the provider registrations reference one and if there isn't one there you
get an error.

The connecton string should always be overridden in your web.config which goes with your
web app so if the connection string is blank, that is a problem with your app, not the
provider.
[14 Feb 2008 23:41] Paulo Santos
The problem is precisely this.

The installation procedure updates the MACHINE.CONFIG. That is the configuration for the
whole machine.

Imagine that I'm a ISP offering an ASP.NET connection to an mySQL database and install the
mySQL Connector/NET to offer my clients this service.

Also imagine that I have 1000+ websites running on the server that does not use a mySQL
database.

So after I install the mySQL Connector/NET all those 1000+ websites start to crash because
the damn connector throws an exception because it demands the connection string there.

I'd have 1000+ less clients on my server because they would be pissed of at me and would
not give a damn about whose fault it is.

To wrap this out, this is a HUGE bug to demand a connection string present on the
machine.config.
[15 Feb 2008 5:23] Reggie Burnett
I'm sorry but I still fail to see the problem.  The connection string is named
LocalMySqlServer and that name means something only to the providers.  If your 1000
clients are not using MySQL then they won't be using our providers and therefore will not
be affected by the connection string.

Here is the reason that connectoin string is there.  We register our providers in
machine.config the same way that SqlClient does.  We register reasonable defaults and one
of those defaults is the name of a connection string.  The idea here is that if you take
the defaults then you can use membership, roles, or profiles in your app without having to
re-register the provider.  You would simply need to define a connection string named
LocalMySqlServer and specify that you want to use the MySQLMembershipProvider (for
example).  If we didn't link the connectoin string to the provider in machine.config, then
the user would have to do that in their web.config which is an unnecessary headache. 
Also, if we register the provider and reference a connection string that is not there,
then every website is affected.  That is considered a sytnax error in machine.config and
no site would work.  They work precisely because we default the connection string.

I"m more than willing to be proven wrong on this and will fix it if that turns out to be
the case but right now I don't see the problem.
[15 Feb 2008 8:27] Paulo Santos
Reggie Burnett wrote:

"Also, if we register the provider and reference a connection string that is not there,
then every website is affected. That is considered a sytnax error in machine.config and no
site would work."

And that is precisely the point. In the scenario that I described the problem is when you
install the mySQL Connector/NET on a machine that DOES NOT have mySQL installed locally.

By default the ASP.NET combines the providers from the machine.config with the providers
on the web.config. When a website attempts to access the Membership class for the first
time the ASP.NET initialize the entire collection, that is, the providers on the
web.config AND on the MACHINE.CONFIG.

Because the box does not have the mySQL installed (it is installed on another machine) the
installation procedure defaults an empty string which causes the error on every freaking
website, that uses the Membership class, hosted on the server.

As I stated on the bug description I see two possible solutions:

1. Fix the installation procedure to ask for the desired server in case no mySQL is found
on the current box; or

2. Fix the mySQL Connector/NET in a way that it does not attempt to connect to the mySQL
database on its initialization procedure.
[15 Feb 2008 8:34] Paulo Santos
There is a workaround as I posted on my blog
(http://pjondevelopment.50webs.com/blog/2008/02/workaround-to-mysql-connectornet-bug.html)
.

But it requires changing every website installed on the machine.

I'm not saying that the installation should not change the machine config, I'm saying that
it should work with its own defaults.

If there is no mySQL on the computer where the mySQL Connector/NET is being installed it
should ask for where to point the default database.
[22 Feb 2008 18:54] Reggie Burnett
This is now verified.  I didn't realize (but should have) that all the providers listed in
machine.config would be initialized when the web admin is shown.
[22 Feb 2008 18:56] Bugs System
A patch for this bug has been committed. After review, it may
be pushed to the relevant source trees for release in the next
version. You can access the patch from:

  http://lists.mysql.com/commits/42857
[22 Feb 2008 18:58] Reggie Burnett
Fixed in 5.2.1
[1 Mar 2008 11:21] MC Brown
A note has been added to the 5.2.1 changelog: 

When using web providers, the Connector/NET would check the schema and cache the
application id, even when the connection string had been set. The effect would be to break
the memvership provider list.