2012-03-26 8 views
13

He una db pertenencia SQL existente que he utilizado con formularios web, estoy tratando de configurarlo para trabajar con mvc4 pero sin suerte, cuando trato de conseguir usuario por ID (sé que este usuario existe) Obtengo una excepción nula. Y la web abro la configuración de la aplicación web. Puedo ver claramente que no tiene miembros ni roles ... etc.Configuración de pertenencia existente con mvc4

aquí es parte de configuración de mi web froms aplicación:

<configuration> 
    <connectionStrings> 
    <add name="ApplicationServices" connectionString="Data Source=myserver;Initial Catalog=mydb;User ID=myid;Password=mypwd" providerName="System.Data.SqlClient" /> 
    </connectionStrings> 
    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    <authentication mode="Forms"> 
     <forms loginUrl="~/Account/Login.aspx" timeout="2880" /> 
    </authentication> 
    <membership> 
     <providers> 
     <clear /> 
     <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" 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="ApplicationServices" applicationName="/" /> 
     </providers> 
     <properties> 
     <add name="UrgentPoints" type="System.Int32" defaultValue="0" /> 
     </properties> 
    </profile> 
    <roleManager enabled="true"> 
     <providers> 
     <clear /> 
     <add connectionStringName="ApplicationServices" applicationName="/" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" /> 
     <add applicationName="/" name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" /> 
     </providers> 
    </roleManager> 
.... 

Y aquí es para MVC:

<configuration> 
    <connectionStrings> 
    <add name="DefaultConnection" connectionString="Data Source=myserver;Initial Catalog=mydb;User ID=myid;Password=mypwd" providerName="System.Data.SqlClient" /> 
    </connectionStrings> 
    <appSettings> 
    <add key="webpages:Version" value="2.0.0.0" /> 
    <add key="webpages:Enabled" value="true" /> 
    <add key="PreserveLoginUrl" value="true" /> 
    <add key="ClientValidationEnabled" value="true" /> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 
    </appSettings> 
    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    <authentication mode="Forms"> 
     <forms loginUrl="~/Account/Login" timeout="2880" /> 
    </authentication> 
    <pages> 
     <namespaces> 
     <add namespace="System.Web.Helpers" /> 
     <add namespace="System.Web.Mvc" /> 
     <add namespace="System.Web.Mvc.Ajax" /> 
     <add namespace="System.Web.Mvc.Html" /> 
     <add namespace="System.Web.Routing" /> 
     <add namespace="System.Web.WebPages" /> 
     </namespaces> 
    </pages> 
    <profile defaultProvider="DefaultProfileProvider"> 
     <providers> 
     <add name="DefaultProfileProvider" type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" /> 
     </providers> 
    </profile> 
    <membership> 
     <providers> 
     <add connectionStringName="DefaultConnection" enablePasswordRetrieval="false" 
      enablePasswordReset="true" requiresQuestionAndAnswer="false" 
      requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" 
      minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" 
      applicationName="/" name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
     </providers> 
    </membership> 
    <roleManager> 
     <providers> 
     <add connectionStringName="DefaultConnection" applicationName="/" 
      name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
     </providers> 
    </roleManager> 
    <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" applicationName="/" /> 
     </providers> 
    </sessionState> 
    </system.web> 
    <system.webServer> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <modules runAllManagedModulesForAllRequests="true" /> 
    </system.webServer> 
+0

MVC 4 utilizando algo más de Sto re Procedimiento para verificar la cuenta. Tengo este error "No se pudo encontrar el procedimiento almacenado 'dbo.aspnet_CheckSchemaVersion'." ¿Algún organismo conoce algunas herramientas para migrar a nuevos datos de miembros? –

+0

@ThantZin Si está configurando nuevas tablas de proveedor MVC4, no tiene que usar la herramienta aspnet_regsql.exe, elimine las tablas que haya creado con eso. Ahora cambie la cadena de conexión en su archivo web confing. Después de eso, inicie la configuración de ASP.NET y después de la configuración tendrá nuevas tablas. El comentario/respuesta que proporciono a continuación responde si usted ya tenía tablas de proveedores anteriores en su base de datos y está cambiando a MVC4. – formatc

Respuesta

4

En primer lugar, asegúrese de cambiar a los proveedores de Asp.Net Universal (paquete Nuget) y luego asegúrese de conectarse al mismo DB como la aplicación anterior. El esquema para asp.net db no ha cambiado y debería funcionar bien con MVC 4.

+1

En realidad descubrí cuál es el problema, MVC4 aparentemente usa diferentes proveedores de membresía, así que solo tuve que cambiar a los viejos, desde System.Web.Providers.DefaultProfileProvider a System.Web.Security.SqlMembershipProvider y desde los roles y el perfil. – formatc

+0

Extraño, he visto la solución propuesta por Israel Lot en otros lugares también, y parece funcionar para algunas personas, pero no funciona para mí. Sigo recibiendo un mensaje de error que dice "El nombre de usuario o la contraseña proporcionados son incorrectos". Aunque no he intentado reemplazar DefaultProfileProvider por SqlMembershipProvider. Me hubiera gustado poder usar DefaultProfileProvider. Al final, seguí usando el antiguo proveedor de Membresía ASP.Net, y modifiqué mi controlador en consecuencia. –

1

He tenido el mismo problema: señalar la aplicación MVC4 a una base de datos aspnet "vieja". Los usuarios/contraseñas existentes no pueden recuperarse en la configuración "predeterminada" (System.Web.Providers.DefaultProfileProvider) -> tenga en cuenta que estas contraseñas están encriptadas y las configuraciones apropiadas están presentes en el web.config local (en system.web)

<machineKey 
    validationKey= "A3..." 
    decryptionKey= "8B..." 
    validation="SHA1" 
    decryption="AES"/> 

Si agrego un nuevo usuario con el "DefaultProfileProvider" ese usuario se puede conciliar y autenticado - que simplemente no funciona con los usuarios existentes que se agregaron con el proveedor de "viejo" me parece.

no he tenido la oportunidad de "cambiar" a la antigua pero yo sospecharía que funciona (gracias user1010609) @Israel - Es extraño y debería funcionar - pero no es así;)

0

Recuerde que debe incluir en las referencias de su proyecto de la biblioteca: System.Web.Providers.dll

22

Aquí está mi camino después de 3 días de buscar en Google. Utilizando MVC4 RC, .NET Framework 4.5, SQL Server Express con el nuevo SqlMemberDB creado por .NET 4 causa que SqlMemberDB antiguo falte algún procedimiento almacenado.

  1. añadir en una configuración más a <AppSetting> indicados a continuación para desactivar "la simple pertenencia":

    <add key="enableSimpleMembership" value="false" /> 
    
  2. añadir en conexión de base de datos según sea necesario. Estoy usando SQL Server 2000, así que deshabilite la instancia del usuario.

    <add name="ScqMember_Context" 
        connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=MemberDB;User ID=xxx;Password=xxx;Integrated Security=False;User Instance=False;MultipleActiveResultSets=False" 
        providerName="System.Data.SqlClient" /> 
    
  3. copie la configuración de configuración de machine.ini en v4 .NET framework.

    <membership> 
        <providers> 
         <clear/> 
         <add name="AspNetSqlMembershipProvider" 
          type="System.Web.Security.SqlMembershipProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 
          connectionStringName="ScqMember_Context" 
          enablePasswordRetrieval="false" enablePasswordReset="true" 
          requiresQuestionAndAnswer="true" applicationName="/" 
          requiresUniqueEmail="false" passwordFormat="Hashed" 
          maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7" 
          minRequiredNonalphanumericCharacters="1" 
          passwordAttemptWindow="10" passwordStrengthRegularExpression="" /> 
        </providers> 
    </membership> 
    <profile> 
        <providers> 
         <clear/> 
         <add name="AspNetSqlProfileProvider" 
          connectionStringName="ScqMember_Context" 
          applicationName="/" 
          type="System.Web.Profile.SqlProfileProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
        </providers> 
    </profile> 
    <roleManager enabled="true"> 
        <providers> 
         <clear /> 
         <add connectionStringName="ScqMember_Context" 
          applicationName="/" 
          name="AspNetSqlRoleProvider" 
          type="System.Web.Security.SqlRoleProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
        </providers> 
    </roleManager> 
    
  4. Cambiar inicio de sesión() del controlador de la cuenta de la siguiente manera

    módulo
    /// aspnetSQLMember Authentication 
    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."); 
        } 
    } 
    
  5. actualización de cierre de sesión de AccountController como a continuación

    /// aspnetSQLMember Authentication 
    FormsAuthentication.SignOut(); 
    

Gracias,

+0

Funcionó para mí. ¡Gracias! – JSWork

+0

gracias por los consejos para deshabilitar la membresía simple. Tengo un caso en el que no uso membresía simple y siempre arroja la excepción. No se puede conectar al servidor SQL después de iniciar sesión correctamente y redirigir a la página deseada. ¡Gracias de nuevo! – longbkit

+1

Creo que la función Register() en el AccountController necesita ser modificada también. –