15

Ho appena scaricato un VS 2012 insieme a ASP.NET 4.5 e MVC 4.0 e stavo dando dei calci alle gomme con un'app campione e ho scoperto che l'autenticazione dei moduli funziona perfettamente con ASP.NET 4.0/MVC 3 sembra non funzionare più con l'ultima versione.L'autenticazione di moduli ASP.NET 4.5/MVC 4 non riesce

Quando faccio una chiamata alla funzione di login nel controller di azione, la chiamata non riesce 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); 
} 

ho sostituito questo codice con l'equivalente in mia fonte VS 2010, e che anche fallisce (usando la ormai obsoleta funzione FormsAuthentication.Authenticate).

La mia domanda è: qualcuno ha effettuato il porting di un'app MVC3 a MVC4 e ha trovato una soluzione alternativa a questo problema? Sto usando IIS Express, quindi suppongo che potrebbe causare qualche problema in qualche modo, ma se hai qualche idea, lo apprezzerei.

ho copiato la mia configurazione dal mio asp.net lavoro 4/MVC3 app come segue, ma senza fortuna (ecco le parti rilevanti):

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

risposta

3

Il problema qui è che il modello di Internet predefinito mvc4 sta usando SimpleMembership per gestire l'appartenenza/informazioni ruoli. Il codice nel modello ha assunto questo e può funzionare solo con membri semplici. Quando installi i provider universali, il codice del controller dell'account esplode poiché non riesce a capire i provider universali. Guarda questo post che spiega ulteriormente in questo scenario 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 - grazie per aver segnalato quell'articolo. Ho notato che un sacco di commenti sull'articolo dicevano che i nuovi provider erano tutt'altro che semplici e che non esiste un percorso di migrazione regolare se si desidera convertire i membri/ruoli esistenti nel nuovo schema. Mi sembra che mentre loro hanno tentato di semplificare un sistema complesso, lo hanno reso ancora di più, e solo provando le nuove cose apportando una rapida modifica al web.config si ottengono nuove tabelle che non funzionano con il impostazione precedente. Ne ho di più da imparare di sicuro! –

2

Per quanto mi riguarda, ho avuto un problema perché ci sono alcuni cambiamenti alle impostazioni web.config è necessario (da http://www.asp.net/whitepapers/mvc4-release-notes)

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

fissaggio queste impostazioni (che non sembra che tu abbia aggiunto) ha ottenuto funzionare le cose per me quando ho avuto problemi di accesso.

+0

Il web.config che ho incluso era solo uno snippet con le modifiche che ho aggiunto per l'autenticazione dei moduli. La chiave/i valori che hai sopra sono nel web.config predefinito, e non li ho rimossi (lì nel mio web.config completo). Grazie per la risposta, però. –

+0

Stavo controllando la chiamata a "WebSecurity.InitializeDatabaseConnection (" DefaultConnection "," UserProfile "," UserId "," UserName ", autoCreateTables: false);" e ho guardato la tabella "UserProfile" nel mio DB ed era vuota. Hanno cambiato lo schema? Quando vado allo strumento "Configurazione sito web ASP.net", mostra i miei utenti, ma l'app non mi consente ancora di accedere. –

+0

Grazie ... PreserveLoginUrl era la chiave del mio problema.Il login funzionava correttamente ma quando si utilizzava [Autorizza (ruoli = "admin")] non funzionava. – RonnBlack

34

Se il ticket di autenticazione dei moduli deve essere condiviso tra le applicazioni utilizzando una versione precedente del framework .NET, è necessario configurare in modo esplicito le app .NET 4.5 per utilizzare le modalità di compatibilità del computer precedenti o non saranno in grado di crittografare/decodifica il ticket di autenticazione dei moduli.

Nel web.config dell'applicazione .net 4.5, impostare l'attributo di modalità di compatibilità:

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

Questo permetterà tuoi NET 4.5 app per lavorare con i ticket di autenticazione forme generate dalle versioni precedenti di .NET.

Nota: se su uno dei server non è installato .NET Framework 2.0 SP2, sarà necessario impostare la modalità di compatibilità su "Framework20SP1".

MSDN - MachineKeySection.CompatibilityMode Property

+0

James - Ho provato il tuo suggerimento proprio ora e non sembra fare alcuna differenza, e non riesco ad accedere. Pensi che abbia qualcosa a che fare con IIS Express? –

+3

Questa impostazione si applica a IIS e IIS Express. Poiché stai condividendo il ticket di autenticazione dei moduli, puoi provare anche le seguenti impostazioni e in . –

+1

James, grazie mille - hai risolto il mio problema in questa domanda http://stackoverflow.com/questions/11532743/mvc-4-authorize-attribute-not-recognizing-forms-auth-from-asp-net- 3-5 –

Problemi correlati