15

Acabo de eliminar un VS 2012 junto con ASP.NET 4.5 y MVC 4.0 y estaba pateando los neumáticos con una aplicación de muestra y encontré que la autenticación de formularios funciona a la perfección con ASP.NET 4.0/MVC 3 ya no parece funcionar con la última versión.La actualización a autenticación de formularios ASP.NET 4.5/MVC 4 falla

Cuando hago una llamada a la función de Inicio de sesión en el controlador de acción, la llamada falla 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); 
} 

he reemplazado este código con el equivalente en mi fuente de VS 2010, y que también falla (utilizando la función FormsAuthentication.Authenticate ahora obsoleta).

Mi pregunta es: ¿Alguien ha portado una aplicación MVC3 a MVC4 y ha encontrado una solución a este problema? Estoy usando IIS Express, así que supongo que puede estar causando algún problema de alguna manera, pero si tienes alguna idea, te agradecería.

copié mi configuración de mi trabajo asp.net aplicación 4/MVC3 de la siguiente manera, pero sin suerte (esto es las partes pertinentes):

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

Respuesta

3

El problema aquí es que la plantilla por defecto Internet mvc4 está utilizando SimpleMembership a administrar la pertenencia/información de roles. El código en la plantilla asume esto y solo puede funcionar con membresía simple. Cuando instala proveedores universales, el código del controlador de la cuenta explota porque no puede entender a los proveedores universales. Mire esta publicación que explica más detalladamente sobre este escenario 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

+0

Pranav - gracias por señalar ese artículo. Noté que muchos comentarios sobre el artículo mencionaban que los nuevos proveedores no eran simples, y que no existe una ruta de migración sin problemas si desea convertir membresías/roles existentes al nuevo esquema. Me parece que si bien trataron de simplificar un sistema complejo, lo han hecho aún más, y simplemente probando lo nuevo haciendo un cambio rápido a la web. Concontiene resultados en tablas nuevas que no funcionan con el sistema. configuración previa. ¡Tengo más para aprender sobre esto seguro! –

2

Para mí, tuve un problema porque hay algunos cambios a la configuración web.config que necesita (de http://www.asp.net/whitepapers/mvc4-release-notes)

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

fijación de estos ajustes (que no se ve que ha añadido) puso las cosas trabajando para mí cuando tuve problemas de conexión.

+0

El archivo web.config que incluí fue solo un fragmento que incluía los cambios que agregué para la autenticación de formularios. Las claves/valores que tiene arriba están en el web.config predeterminado, y no los eliminé (allí en mi web.config completo). Gracias por responder, sin embargo. –

+0

Estaba mirando la llamada a 'WebSecurity.InitializeDatabaseConnection ("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: false);' y miré la tabla "UserProfile" en mi DB y estaba vacía. ¿Cambiaron el esquema? Cuando voy a la herramienta "Configuración del sitio web ASP.net", muestra a mis usuarios, pero la aplicación aún no me permite iniciar sesión. –

+0

Gracias ... PreserveLoginUrl fue la clave de mi problema.El inicio de sesión funcionaba bien pero al usar [Autorizar (Roles = "admin")] estaba fallando. – RonnBlack

34

Si su boleto de autenticación de formularios debe compartirse entre aplicaciones que utilizan una versión anterior de .NET Framework, debe configurar explícitamente sus aplicaciones .NET 4.5 para usar los modos de compatibilidad de máquinas anteriores, o no podrán encriptar/descifrar el ticket de autenticación de formularios.

En web.config de su aplicación .NET 4.5, establezca el atributo de modo de compatibilidad:

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

Esto permitirá que sus aplicaciones .NET 4.5 para trabajar con vales de autenticación de formularios generados por versiones anteriores de .NET.

Nota: Si alguno de sus servidores no tiene instalado .NET Framework 2.0 SP2, tendrá que establecer el modo de compatibilidad en "Framework20SP1" en su lugar.

MSDN - MachineKeySection.CompatibilityMode Property

+0

James - Intenté su sugerencia hace un momento y no parece haber ninguna diferencia, y no puedo iniciar sesión. ¿Cree que tiene algo que ver con IIS Express? –

+3

Esta configuración se aplica tanto a IIS como a IIS Express. Como está compartiendo el boleto de autenticación de formularios, puede probar también las siguientes configuraciones y en . –

+1

James, muchas gracias: ha resuelto mi problema en esta pregunta http://stackoverflow.com/questions/11532743/mvc-4-authorize-attribute-not-recognizing-forms-auth-from-asp-net- 3-5 –

Cuestiones relacionadas