【问题标题】:Upgrading to ASP.NET 4.5/MVC 4 forms authentication fails升级到 ASP.NET 4.5/MVC 4 表单身份验证失败
【发布时间】:2012-08-18 20:03:45
【问题描述】:

我刚刚下载了一个 VS 2012 以及 ASP.NET 4.5 和 MVC 4.0,并正在使用示例应用程序踢轮胎,发现与 ASP.NET 4.0/MVC 3 完美配合的表单身份验证似乎不再适用使用最新版本。

当我在动作控制器中调用 Login 函数时,WebSecurity.Login 调用失败:

public ActionResult Login(LoginModel model, string returnUrl)
{
    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);
}

我已将此代码替换为 VS 2010 源代码中的等效代码,但同样失败(使用现已弃用的 FormsAuthentication.Authenticate 函数)。

我的问题是:有人将 MVC3 移植到 MVC4 应用程序并找到解决此问题的方法吗?我正在使用 IIS Express,所以我想这可能会导致一些问题,但如果您有任何想法,我将不胜感激。

我从我的工作 asp.net 4/MVC3 应用程序中复制了我的配置,如下所示,但没有运气(这里是相关部分):

  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=tcp:sql2k1201.dbprovider.net;Initial Catalog=SQL2012_db;User ID=SQL2012_db_user;Password=dbpassword;" providerName="System.Data.SqlClient" />
  </connectionStrings>

  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />

    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="2880"/>
    </authentication>

    <membership>
      <providers>
        <clear/>
        <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="DefaultConnection"
           enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
           maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
           applicationName="/" />
      </providers>
    </membership>

    <profile>
      <providers>
        <clear/>
        <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="DefaultConnection" applicationName="/" />
      </providers>
    </profile>

    <roleManager enabled="true">
      <providers>
        <clear/>
        <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="DefaultConnection" applicationName="/" />
      </providers>
    </roleManager>

【问题讨论】:

    标签: forms-authentication asp.net-mvc-4 iis-express asp.net-4.5


    【解决方案1】:

    如果您的表单身份验证票需要在使用旧版本 .NET 框架的应用程序之间共享,您必须明确配置您的 .NET 4.5 应用程序以使用早期的机器兼容模式,否则它们将无法加密/解密表单身份验证票。

    在您的 .net 4.5 应用程序的 web.config 中,设置兼容模式属性:

    <system.web>
     <machineKey compatibilityMode="Framework20SP2" /> 
    </system.web>
    

    这将允许您的 .NET 4.5 应用使用由早期 .NET 版本生成的表单身份验证票证。

    注意:如果您的任何服务器未安装 .NET Framework 2.0 SP2,则需要将兼容模式设置为“Framework20SP1”。

    MSDN - MachineKeySection.CompatibilityMode Property

    【讨论】:

    • James - 我刚才试了下你的建议,好像没什么区别,我也无法登录,你觉得跟IIS Express有关系吗?
    • 此设置适用于 IIS 和 IIS Express。由于您共享表单身份验证票,您还可以尝试以下设置以及 >.
    • 詹姆斯,非常感谢 - 你已经解决了我在这个问题中的问题stackoverflow.com/questions/11532743/…
    • 谢谢 - 我们在同一台服务器上集成了两个 .NET 4.5 应用程序,但不断收到“请求的表单身份验证失败。原因:提供的票证无效。”。似乎其中一个应用程序中的某些内容导致它被视为非 4.5 应用程序。
    • @JamesH 我一直在寻找这个解决方案。我正在使用 webforms asp.net 4.0 登录,我的新 MVC 应用程序默认将 httpRuntime 目标框架设置为 4.5.1。在 machineKey 中添加了 compatibleMode 修复它。非常感谢! +1
    【解决方案2】:

    这里的问题是默认的 mvc4 互联网模板使用 SimpleMembership 来管理成员/角色信息。模板中的代码假设了这一点,并且只能与简单成员一起使用。当您安装通用提供程序时,帐户控制器代码会爆炸,因为它无法理解通用提供程序。看看这篇文章,它进一步解释了这个场景http://weblogs.asp.net/jgalloway/archive/2012/08/29/simplemembership-membership-providers-universal-providers-and-the-new-asp-net-4-5-web-forms-and-asp-net-mvc-4-templates.aspx

    【讨论】:

    • Pranav - 感谢您指出那篇文章。我注意到有关文章的大量 cmets 提到新提供者绝非简单,如果要将现有成员资格/角色转换为新模式,则没有平滑的迁移路径。在我看来,虽然他们可能试图简化一个复杂的系统,但他们已经做得更多了,只是通过快速更改 web.config 来尝试新的东西会导致新表无法使用之前的设置。我肯定还有更多要了解的!
    【解决方案3】:

    对我来说,我遇到了一个问题,因为您需要对 web.config 设置进行一些更改(来自http://www.asp.net/whitepapers/mvc4-release-notes

    <appSettings>
      <add key="webpages:Version" value="2.0.0.0" />
      <add key="PreserveLoginUrl" value="true" />
    </appSettings>
    

    当我遇到登录问题时,修复这些设置(看起来不像是你添加的)让我工作正常。

    【讨论】:

    • 我包含的 web.config 只是一个 sn-p,其中包含我为表单身份验证添加的更改。您上面的键/值在默认的 web.config 中,我没有删除它们(在我的完整 web.config 中)。不过,感谢您的回复。
    • 我只是在查看对 'WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: false);' 的调用并查看了我的数据库中的“UserProfile”表,它是空的。他们改变了架构吗?当我转到“ASP.net 网站配置”工具时,它显示了我的用户,但该应用程序仍然不允许我登录。
    • 谢谢... PreserveLoginUrl 是解决我问题的关键。登录工作正常,但使用 [Authorize(Roles="admin")] 时失败。
    猜你喜欢
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多