使用AspNetSqlMembershipProvider的MVC 4

时间:2014-05-15 09:44:07

标签: asp.net-mvc-4 membership-provider simplemembership

我的任务是使用现有的数据库和身份验证,在MVC4中重写现有的Asp.Net Classic Web应用程序。

旧应用程序仍在其表中使用“aspnet_”前缀。我已经修改了新网站的web.config以包含这些提供程序(直接从旧网站复制)

<roleManager enabled="true">
      <providers>
        <remove name="AspNetSqlRoleProvider" />
        <add connectionStringName="LocalSqlServer" applicationName="MyApp" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        <remove name="AspNetWindowsTokenRoleProvider" />
        <add applicationName="IOL" name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
      </providers>
    </roleManager>
    <membership defaultProvider="AspNetSqlMembershipProvider">
      <providers>
        <remove name="AspNetSqlMembershipProvider" />
        <add connectionStringName="LocalSqlServer" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" applicationName="MyApp" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        <remove name="AspNetAdminMembershipProvider" />
        <add connectionStringName="LocalSqlServer" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" applicationName="IOL" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" name="AspNetAdminMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
      </providers>
    </membership>

在我的帐户控制器的登录操作中:

public ActionResult Login(LoginModel model, string returnUrl)
        {
            var auth = Membership.ValidateUser(model.UserName, model.Password);
            if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
            {
                return RedirectToLocal(returnUrl);
            }

            // If we got this far, something failed, redisplay form
            ModelState.AddModelError("", "The user name or password provided is incorrect.");
            return View(model);
        }

如果我从控制器中删除[InitializeSimpleMembership],则auth变量为true,如果我将其添加回来,我会收到一条错误,指出“无法将类型'System.Guid'转换为'int'”。 Websecurity.Login()方法在有和没有class属性的情况下都失败了。

简而言之,如果我删除简单成员资格,表单auth验证用户是否有效,但是当我检查User.Identity.IsAuthenticated对象时,则表示为false。

我错过了什么?我甚至不确定我是否正确实现了这个安全模型,我找不到任何关于它的信息。

1 个答案:

答案 0 :(得分:1)

您不能将旧会员提供者与SimpleMembership(例如WebSecurity)一起使用。您需要使用SimpleMembershipProvider。您必须将数据从旧表结构迁移到SimpleMembership使用的模式。您可以在SimpleMembership表中自定义的唯一内容是包含用户配置文件信息的表,您可以read about here

迁移到MVC4和SimpleMembership已经让你落后于曲线。 SimpleMembership已针对ASP.NET Identity折旧。 ASP.NET Identity需要MVC5,您应该将其迁移到任何方面以利用所有added features以及保持基础组件最新的一般优势。 ASP.NET Identity比SimpleMembership更灵活(SimpleMembership设计简单且不够灵活)甚至还有一篇文章引导您完成migrating SQL Membership to ASP.NET Identity的步骤。