要调用这个方法,"Membership.Provider"属性必须是"ExtendedMembershipProvider"类的一个实例。

39

目前,每当我尝试在我的主机提供商DiscountASP中使用内置的ASP.Net MVC4默认成员资格服务注册用户或登录时,我会收到以下错误:

 

要调用此方法,“Membership.Provider”属性必须是“ExtendedMembershipProvider”的实例。

这在本地不会发生。

这是我的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);
            }
        }
    }
}

这是错误的完整屏幕截图:

有人知道我该如何修复这个问题或者知道一篇文章可以解决吗?


1
能否展示 web.config 文件中的 <membership> 部分?看起来您正在尝试使用 SimpleMembership,但提供程序不匹配。此外,请确保在引用的属性下将 WebMatrix.* 设置为 Copy Local = True - Brad Christie
实际上,由于某些原因,我的Web.config中没有定义会员部分。你能告诉我它应该长什么样吗? - G_Man
5个回答

63

尝试在<system.web>节点内的web.config中设置以下内容:

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

看起来当你使用它时,SimpleMembership没有被识别。

另外,值得注意的是,可以通过NuGet安装WebMatrix.webData库:

PM> Install-Package Microsoft.AspNet.WebPages.WebData

在你的代码的第四行,我遇到了服务器错误:“无法加载文件或程序集'WebMatrix.WebData'或其某个依赖项。系统找不到指定的文件。”可能是什么原因呢? - pt12lol
@pt12lol: 我相信你需要执行 Install-Package Microsoft.AspNet.WebPages.WebData 命令。这将为你提供 WebMatrix* 库套件。 - Brad Christie
1
此外,我必须删除DefaultMembershipProvider生成的数据库才能使其正常工作。 - Arman Bimatov
Nuget安装将代码放入web.config文件中。 - Stuart Dobson

7
尝试修改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);
    }

正确!这是一个很好的修复程序,适用于从aspx页面迁移到MVC的任何人! - TomO

3

我已经按照上述步骤操作,但并没有起到作用。真正起到作用的是更改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>

1
我遇到了同样的错误,但这对我来说是100%关于引用。我多次尝试让WebMatrix.WebSecurity工作时遇到了麻烦......每次都是因为我没有使用MVC 4互联网模板创建项目。
关键在于默认情况下模板中的引用和配置可以正常工作,所以只需重新创建项目即可解决问题。
我的解决方法是: 1.将项目备份到另一个文件夹。 2.检查所有文件 3.创建一个新的MVC 4互联网项目,名称完全相同。 4.复制+粘贴(覆盖)原始项目。 5.添加任何缺失的引用、更改路由、.config设置/数据库连接。

“Internet模板”是什么意思?在Visual Studio中,默认的MVC 4项目模板不能工作吗? - Dan Csharpster
哦,我想你是要选择本地的ASP.NET MVC 4项目模板,然后在下一个屏幕上选择“互联网应用程序”。我是对的吗?我只是想澄清一下,因为我的最初想法是你找到了一个MVC的在线项目模板并安装了它。 - Dan Csharpster

0

我只是修复了同样的问题。

我的问题是在更新nuget包后开始的。我的VS 2019在web.config中添加了新行“membership”和“roleManager”,因此它变成了重复的(之前已经存在)。

我注释掉了旧值,然后每次注销和登录时都会显示这个“membership.provider”警告。

只需使用旧代码更合适。

以下是我删除的web.config中生成的代码:

<membership defaultProvider="DefaultMembershipProvider">
      <providers>
        <add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
      </providers>
    </membership>
    <roleManager defaultProvider="DefaultRoleProvider">
      <providers>
        <add name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" />
      </providers>
    </roleManager>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接