web-dev-qa-db-fra.com

Pour appeler cette méthode, la propriété "Membership.Provider" doit être une instance de "ExtendedMembershipProvider"

Actuellement, chaque fois que j'essaie d'enregistrer un utilisateur ou de me connecter en utilisant les services d'adhésion par défaut intégrés à ASP.Net MVC4 sur mon fournisseur d'hébergement DiscountASP, je reçois l'erreur

Pour appeler cette méthode, la propriété "Membership.Provider" doit être une instance de "ExtendedMembershipProvider".

Cela ne se produit pas localement.

Voici mon InitializeSimpleMembershipAttribute.cs:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public sealed class InitializeSimpleMembershipAttribute : ActionFilterAttribute
{
    private static SimpleMembershipInitializer _initializer;
    private static object _initializerLock = new object();
    private static bool _isInitialized;

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // Ensure ASP.NET Simple Membership is initialized only once per app start
        LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);
    }

    private abstract class SimpleMembershipInitializer
    {
        protected SimpleMembershipInitializer()
        {
            Database.SetInitializer<UsersContext>(null);

            try
            {
                using (var context = new UsersContext())
                {
                    if (!context.Database.Exists())
                    {
                        // Create the SimpleMembership database without Entity Framework migration schema
                        ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
                    }
                }

                WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.Microsoft.com/fwlink/?LinkId=256588", ex);
            }
        }
    }
}

Voici une capture d'écran complète de l'erreur:

Est-ce que quelqu'un sait comment je peux résoudre ce problème ou connaît un article qui y répond?

39
G_Man

Essayez de configurer ce qui suit dans votre web.config dans le <system.web> noeud:

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

On dirait que SimpleMembership n'est pas reconnu lorsque vous allez l'utiliser.

En outre, il peut être utile d'inclure le WebMatrix.webData la bibliothèque peut être installée via NuGet:

PM> Install-Package Microsoft.AspNet.WebPages.WebData
63
Brad Christie

Essayez de modifier la fonction de connexion sous AccountController.cs

        //
    // POST: /Account/Login

    [AllowAnonymous]
    [HttpPost]
    public ActionResult Login(LoginModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            if (Membership.ValidateUser(model.UserName, model.Password))
            {
                FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                if (Url.IsLocalUrl(returnUrl))
                {
                    return Redirect(returnUrl);
                }
                else
                {
                    return RedirectToAction("Index", "Home");
                }
            }
            else
            {
                ModelState.AddModelError("", "The user name or password provided is incorrect.");
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }
7
Tarik

A fait les étapes ci-dessus mais cela n'a pas aidé. Ce qui a aidé à changer web.config:

      <dependentAssembly>
    <assemblyIdentity name="WebMatrix.Data" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-3.1.0.0" newVersion="3.0.0.0" />
  </dependentAssembly>
          <dependentAssembly>
    <assemblyIdentity name="WebMatrix.WebData" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-3.1.0.0" newVersion="3.0.0.0" />
  </dependentAssembly>
3
Kolya Evdokimov

J'ai eu la même erreur, mais c'était des références à 100% pour moi. J'ai eu du mal à faire fonctionner WebMatrix.WebSecurity plusieurs fois ... à chaque fois parce que je n'ai pas créé le projet en utilisant le modèle Internet MVC 4.

La clé est que les références et la configuration fonctionnent par défaut dans le modèle, alors recréez simplement votre projet et tout ira bien.

Ma solution est la suivante: 1. Sauvegardez mon projet dans un autre dossier. 2. Extrayez tous les fichiers 3. Créez un nouveau projet Internet MVC 4, sous le même nom exact. 4. Copiez + collez (écrasez) le projet d'origine. 5. Ajoutez les références manquantes, les itinéraires modifiés, les paramètres .config/les connexions DB.

1
Robert J. Good