2012-03-26 9 views
13

Possiedo un db di appartenenza SQL che ho utilizzato con Webforms, sto provando a configurarlo per funzionare con mvc4 ma senza fortuna, quando provo a ottenere l'utente tramite id (conosco questo utente esiste) Ricevo un'eccezione nullo.E il Web apro la configurazione della app web posso chiaramente vedere che non ha membri o ruoli ... ecc.Impostazione dell'iscrizione esistente con mvc4

Ecco parte della configurazione mia azienda froms app:

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

E qui è per 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 utilizzando qualche extra Sto re Procedura per verificare l'account. Ho questo errore "Impossibile trovare la stored procedure" dbo.aspnet_CheckSchemaVersion "." Qualcuno ha conosciuto alcuni strumenti per migrare a nuovi dati dei membri? –

+0

@ThantZin Se si stanno impostando nuove tabelle di provider MVC4, non è necessario utilizzare lo strumento aspnet_regsql.exe, eliminare le tabelle create dall'utente. Ora cambia la stringa di connessione nel tuo file web di confing. Dopodiché, avvia la configurazione di ASP.NET e dopo l'installazione avrai nuove tabelle. Il commento/risposta fornito da me sotto risponde aplies se hai già vecchie tabelle del fornitore nel tuo database e stai passando a MVC4. – formatc

risposta

4

prima essere sicuri di passare a fornitori Asp.Net universali (package NuGet) e quindi assicurarsi di connettersi allo stesso DB della vecchia applicazione. Lo schema per il db asp.net non è cambiato e dovrebbe funzionare correttamente con MVC 4.

+1

In realtà ho scoperto qual è il problema, MVC4 apparentemente utilizza diversi provider di appartenenze quindi ho dovuto passare a quelli vecchi, da System.Web.Providers.DefaultProfileProvider a System.Web.Security.SqlMembershipProvider e lo stesso da ruoli e profilo. – formatc

+0

Strano, ho visto la soluzione proposta da Israel Lot anche altrove, e sembra funzionare per alcune persone, ma non funziona per me. Continuo a ricevere un messaggio di errore che dice "Il nome utente o la password forniti non sono corretti". Non ho provato però a sostituire DefaultProfileProvider da SqlMembershipProvider. Mi sarebbe piaciuto poter utilizzare DefaultProfileProvider. Alla fine, ho continuato a utilizzare il vecchio provider di Membership ASP.Net e ho modificato il mio controller di conseguenza. –

1

Ho riscontrato lo stesso problema: puntare l'applicazione MVC4 a un database "vecchio" di aspnet. Utenti/password esistenti non possono essere recuperati con le impostazioni "predefinite" (System.Web.Providers.DefaultProfileProvider) -> si noti che queste password sono crittografate e le impostazioni appropriate sono presenti nel web.config locale (in system.web)

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

Se posso aggiungere un nuovo utente con il "DefaultProfileProvider" che l'utente possono essere riconciliati e autenticata - semplicemente non funziona con gli utenti esistenti che sono stati aggiunti con il fornitore "vecchio" mi pare.

non ho avuto la possibilità di "switch" per il vecchio, ma ho il sospetto che funziona (grazie user1010609) @Israel - E 'strano e dovrebbe funzionare - ma non è così;)

0

Ricordate che è necessario includere nei riferimenti del progetto della biblioteca: System.Web.Providers.dll

22

Ecco il mio modo dopo 3 giorni Googling. Utilizzando MVC4 RC, .net Framework 4.5, SQL Server Express con nuovo SqlMemberDB creato da .NET 4 causa la perdita di alcune stored procedure del vecchio SqlMemberDB.

  1. aggiungere in un altro ambiente a <AppSetting> come di seguito per disattivare la "membership semplice":

    <add key="enableSimpleMembership" value="false" /> 
    
  2. aggiungere nella connessione al database come richiesto. Sto usando SQL Server 2000, quindi disabilita l'istanza utente.

    <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. copia configurazione di configurazione da machine.ini sotto 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. Change Login() dal controller del conto, come di seguito

    modulo
    /// 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. Aggiornamento disconnessione da AccountController come di seguito

    /// aspnetSQLMember Authentication 
    FormsAuthentication.SignOut(); 
    

Grazie,

+0

ha funzionato per me. Grazie! – JSWork

+0

grazie per i suggerimenti per disabilitare la partecipazione semplice. Ho un caso in cui non uso simplemembership e genera sempre un'eccezione Impossibile connettersi al server SQL dopo aver effettuato correttamente l'accesso e reindirizzato alla pagina desiderata. Grazie ancora! – longbkit

+1

Credo che anche la funzione Register() nell'AccountController debba essere modificata. –