Saturday, June 8, 2013

Solving To call this method, the “Membership.Provider” property must be an instance of “ExtendedMembershipProvider”

When using Asp.Net MVC 4 and hosting your website with a hosting provider like TheDomainConnection or Godaddy, you may encounter a problem that seems strange. 

When testing locally on your dev machine not on the host, you  may be able to create accounts just fine. However, after you  load your site to your host,  you may get the error 
  
To call this method, the “Membership.Provider” property must be an instance of “ExtendedMembershipProvider”

You think to yourself "Self, why am I getting this error when this worked on my dev machine not more than a few moments ago?" The answer is interesting.

The error is happening because of this code located in the WebSecurity file of the WebMatrix.WebData dll -


        private static ExtendedMembershipProvider VerifyProvider()
        {
            ExtendedMembershipProvider provider = Membership.Provider as ExtendedMembershipProvider;

What is the significance of this? That Membership.Provider line is getting the membership information from your web.config and if you have not configured your system to use a provider that extends the ExtendedMembershipProvider class, the provider will not match and your application will not work. The first step to solving this problem is to add the following line to your web.config file -

  <appSettings>
    <add key="enableSimpleMembership" value="true" />
  </appSettings>

However, in some cases, your website host settings are actually going to override that setting in your web.config! That's right - your host configuration is going to override your own. This means that the setting above will be ignored and if your host is implementing a provider that is NOT an extension of the ExtendedMembershipProvider, you are going to experience the error. This happens because NONE of the old providers used with prior versions of Asp.Net/Asp.Net MVC are extensions of ExtendedMembershipProvider.
So how do you solve this problem?

Place the following code in your web.config file of the website you are hosting.


  <system.web>
    <roleManager enabled="true" defaultProvider="SimpleRoleProvider">
      <providers>
        <clear />
        <add name="SimpleRoleProvider" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData" />
      </providers>
    </roleManager>
    <membership defaultProvider="SimpleMembershipProvider">
      <providers>
        <clear />
        <add name="SimpleMembershipProvider" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData" />
      </providers>
    </membership>
    <sessionState mode="InProc" customProvider="DefaultSessionProvider">
      <providers>
        <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" />
      </providers>
    </sessionState>
  </system.web>
This will override your host's settings for your website and get your website working!
Smooches, 
Kila Morton

6 comments:

Scott Foster said...

Nice and Concise, thanks!

shobhitsaraswat said...

how can we set PasswordFormat="Clear"
in providers

Engineer Muhammad Sajjad said...

good one

Anonymous said...

This is exactly what I needed to for my implementation of WebSecurity into a Ranorex testing suite!

Thanks!

Szymon said...

Hi! I have this exception with Oracle Membership provider and I tried to solve this problem with the similar way. Doesn't work.

Do you have some experience or idea which could help me?

Anonymous said...

Great explanation, wish I would've found this article first!