15

Ich habe gerade eine VS 2012 zusammen mit ASP.NET 4.5 und MVC 4.0 heruntergekommen und trat die Reifen mit einer Beispielanwendung und fand, dass die Formularauthentifizierung perfekt funktioniert mit ASP.NET 4.0/MVC 3 scheint nicht mehr mit der neuesten Version zu arbeiten.Upgrade auf ASP.NET 4.5/MVC 4 Formulare Authentifizierung schlägt fehl

Wenn ich einen Aufruf an die Login-Funktion im Regler machen, schlägt der WebSecurity.Login Aufruf:

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); 
} 

ich diesen Code mit dem Äquivalent ersetzt habe in meine VS 2010 Quelle, und das auch schlägt fehl (mit der jetzt veralteten FormsAuthentication.Authenticate-Funktion).

Meine Frage ist: Hat jemand eine MVC3 zu MVC4 App portiert und eine Abhilfe für dieses Problem gefunden? Ich benutze IIS Express, also denke ich, dass das irgendwie Probleme verursachen könnte, aber wenn Sie irgendwelche Ideen haben, würde ich es begrüßen.

ich meine Konfiguration von meinem Arbeits asp.net 4/MVC3 App kopiert wie folgt, aber kein Glück (hier ist die relevanten Teile):

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

Antwort

3

Das Problem hierbei ist, dass die Standard mvc4 Internet Vorlage SimpleMembership verwendet Mitgliedschaft/Rollen Informationen zu verwalten. Der Code in der Vorlage geht davon aus und kann nur mit simplemember arbeiten. Wenn Sie universelle Provider installieren, explodiert der Account-Controller-Code, da er universelle Provider nicht verstehen kann. Schauen Sie sich diesen Post an, der weiter zu diesem Szenario erklärt 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 - danke für den Hinweis auf diesen Artikel. Ich bemerkte, dass viele Kommentare zu dem Artikel erwähnten, dass die neuen Anbieter alles andere als einfach seien, und es gibt keinen reibungslosen Migrationspfad, wenn Sie vorhandene Mitgliedschaften/Rollen in das neue Schema konvertieren möchten. Es scheint mir, während sie vielleicht versucht haben, ein komplexes System zu vereinfachen, haben sie es mehr gemacht, und nur die neuen Sachen ausprobiert, indem sie eine schnelle Änderung an der web.config ergeben, führt zu neuen Tabellen, die nicht mit dem funktionieren vorherige Einrichtung. Ich muss mehr darüber erfahren! –

2

Für mich, ich hatte ein Problem, weil es einige Änderungen auf die web.config-Einstellungen müssen Sie (von http://www.asp.net/whitepapers/mvc4-release-notes)

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

diese Einstellungen Fixing bekam (die es nicht wie Sie haben hinzugefügt sieht) für mich, die Dinge zu arbeiten, wenn ich Probleme mit der Anmeldung hatte.

+0

Die Web.config, die ich einschloss, war nur ein Ausschnitt, der die Änderungen hatte, die ich für Formularauthentifizierung hinzufügte. Die Schlüssel/Werte, die Sie oben haben, sind in der Standardkonfiguration web.config, und ich habe sie nicht entfernt (dort in meiner vollständigen web.config). Danke für Ihre Antwort. –

+0

Ich habe gerade über den Aufruf von 'WebSecurity.InitializeDatabaseConnection ("DefaultConnection", "UserProfile", "UserId", "UserName", AutoCreateTables: false);' und schaute auf die Tabelle "UserProfile" in meiner DB und es war leer. Haben sie das Schema geändert? Wenn ich zum Tool "ASP.net-Website-Konfiguration" gehe, werden meine Nutzer angezeigt, aber die App lässt mich immer noch nicht einloggen. –

+0

Danke ... PreserveLoginUrl war der Schlüssel für mein Problem.Login funktionierte gut, aber wenn [Authorize (Roles = "admin")] verwendet wurde, scheiterte es. – RonnBlack

34

Wenn Ihr Formularauthentifizierungsticket zwischen Anwendungen mit einer älteren Version des .NET-Frameworks freigegeben werden muss, müssen Sie Ihre .NET 4.5-Apps explizit für die Verwendung der früheren Computerkompatibilitätsmodi konfigurieren oder sie können nicht verschlüsseln/entschlüsseln Sie das Formularauthentifizierungsticket.

In Ihrer .net 4.5-Anwendung web.config, stellen Sie den Kompatibilitätsmodus Attribut:

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

Dies ermöglicht Ihren .NET 4.5-Anwendungen mit Formularauthentifizierung Tickets von früheren .NET-Versionen erzeugt zu arbeiten.

Hinweis: Wenn auf einem Ihrer Server .NET Framework 2.0 SP2 nicht installiert ist, müssen Sie stattdessen den Kompatibilitätsmodus auf "Framework20SP1" setzen.

MSDN - MachineKeySection.CompatibilityMode Property

+0

James - Ich habe gerade Ihren Vorschlag ausprobiert und es scheint keinen Unterschied zu machen, und ich kann mich nicht einloggen. Glauben Sie, dass es etwas mit IIS Express zu tun hat? –

+3

Diese Einstellung gilt für IIS und IIS Express. Da Sie das Formular auth-Ticket freigeben, können Sie auch die folgenden Einstellungen versuchen: und unter . –

+1

James, vielen Dank - Sie haben mein Problem in dieser Frage gelöst http://stackoverflow.com/questions/11532743/mvc-4-authorize-attribute-not-recognizing-forms-auth-from-asp-net- 3-5 –

Verwandte Themen