Ist ASP.NET MVC 5 nicht mit dem WebMatrix SimpleMembershipProvider kompatibel?


68

Wir haben eine vorhandene Anwendung, die auf ASP.NET MVC 4 & Web API erstellt wurde. Die Admin-Teile der Site verwenden die einfache Mitgliedschaft. Ich bin daran interessiert, die Anwendung auf MVC 5 / Web API 2 zu aktualisieren, um einige der neuen Funktionen zu nutzen, die hinzugefügt wurden. Aber es sieht so aus, als wären sie möglicherweise nicht kompatibel.

Insbesondere nach der Installation der RC-Pakete von NuGet in einem der Projekte in meiner Lösung und der Aktualisierung der web.config-Informationen beginnt die Anwendung beim Start auf der aufrufenden Leitung zu sterben WebSecurity.InitializeDatabaseConnection(), mit der folgenden Ausnahme:

[MethodAccessException: Attempt by security transparent method 'WebMatrix.WebData.PreApplicationStartCode.OnConnectionOpened(System.Object, WebMatrix.Data.ConnectionEventArgs)' to access security critical method 'System.Web.WebPages.HttpContextExtensions.RegisterForDispose(System.Web.HttpContextBase, System.IDisposable)' failed.]
   WebMatrix.WebData.PreApplicationStartCode.OnConnectionOpened(Object sender, ConnectionEventArgs e) +70
   WebMatrix.Data.Database.OnConnectionOpened() +70
   WebMatrix.Data.Database.EnsureConnectionOpen() +51
   WebMatrix.Data.Database.QueryValue(String commandText, Object[] args) +63
   WebMatrix.WebData.DatabaseWrapper.QueryValue(String commandText, Object[] parameters) +13
   WebMatrix.WebData.SimpleMembershipProvider.GetUserId(IDatabase db, String userTableName, String userNameColumn, String userIdColumn, String userName) +206
   WebMatrix.WebData.SimpleMembershipProvider.ValidateUserTable() +87

Andere Projekte in derselben Lösung mit Simple Membership, die ich nicht aktualisiert habe, funktionieren weiterhin einwandfrei.

Wenn Sie nach weiteren Informationen suchen, werden natürlich viele Treffer für diese Ausnahme angezeigt, aber nichts Besonderes für WebMatrix.

FWIW: Ich weiß, dass Microsoft eine (weitere) Mitgliedschafts- und Identitätslösung eingeführt hat , aber es sei denn, es gibt eine Möglichkeit, diese mit den vorhandenen Simple Membership-Tabellen oder einem nahtlosen Migrationspfad für alle vorhandenen Benutzerdaten zu verwenden, ist dies keine Option für uns.

UPDATE (11. Oktober)

Ich habe es gerade noch einmal versucht, indem ich den aktuellen Trunk unserer App neu ausgecheckt habe. Ich verwende Visual Studio 2012, habe aber ansonsten die Anweisungen von MS zum Aktualisieren eines vorhandenen Projekts befolgt. Nach dem Update auf MVC 5 / Web API 2 / EF 6 wurde die App gestartet und lief einwandfrei.

Es gab keine expliziten Vertrauensanforderungen in der web.configzu entfernenden. Ich habe den Code von dieser Frage zu Global.asax.cs, und es meldet , dass der App mit vollem Vertrauen läuft (in IIS Express, nur F5-ed aus VS).

Wenn Sie denselben Anruf erneut hinzufügen InitializeDatabaseConnection(), beginnt er mit genau derselben Ausnahme zu sterben.

LÖSUNG (28. Oktober)

Als ich die Lösung in @ Kevins Update vom Freitag ausprobierte, stellte ich fest, dass sie funktioniert. Es war wirklich seltsam für mich , dass das Hinzufügen dieses scheinbar unzusammenhängende Pakets dieser Sicherheitsprobleme lösen würde, und noch mehr seltsam , nachdem ich das Paket aus meiner Lösung entfernt, und es arbeitet weiter .

Bei genauerem Hinsehen wurde mir klar, dass der Grund, warum dies das Verhalten behebt, recht einfach ist: Das Microsoft.AspNet.WebHelpersPaket enthält zwei Abhängigkeiten, die meiner Lösung hinzugefügt wurden: Microsoft.AspNet.WebPages.Dataund Microsoft.AspNet.WebPages.WebData. Microsoft hat die WebMatrix-Klassen in neue Pakete verschoben.

Das hinzugefügte Hilfspaket behebt das Problem also nicht aufgrund von Aktivitäten, sondern weil es dazu führte, dass aktualisierte Versionen der defekten Assemblys zu meiner Lösung hinzugefügt wurden . Die Lösung für die anfängliche Inkompatibilität besteht also darin, diese neuen Pakete zu installieren, wenn Sie alles andere von NuGet aktualisieren:

Install-Package Microsoft.AspNet.WebPages.WebData

UPDATE (13. Mai 2015)

Mir wurde vorgeschlagen, dass Sie möglicherweise auch das zweite neue Paket manuell installieren müssen:

Install-Package Microsoft.AspNet.WebPages.Data

Dies sollte nicht erforderlich sein, da dieses Paket eine explizite Abhängigkeit vom ersten ist und NuGet intelligent genug sein sollte, um beide zu installieren. Wenn beim Erstellen jedoch eine Fehlermeldung angezeigt wird oder NuGet die Abhängigkeit nicht hinzufügt, kann dies hilfreich sein.


6
Ich wünschte, ich könnte dies mehr als einmal abstimmen. Danke, danke, danke, dass Sie sich die Mühe gemacht haben, Ihren Prozess zu dokumentieren. Ich wollte gerade in den Panikmodus wechseln. Sie haben mich davor bewahrt, mich in dieser morgendlichen Präsentation zu schämen.
Joseph White

Ich musste auch tatsächlich die Webmatrix aus meinen Projektreferenzen entfernen. Die Deinstallation dieser Pakete und die Installation von Webhelfern haben diesen Teil für mich nicht erledigt.
Beth Whitezel

Ich danke dir sehr. Installationspaket Microsoft.AspNet.WebPages.WebData funktioniert für mich
ARC

Antworten:


36

WebMatrix ist mit MVC 5 kompatibel.

Ich habe ein leeres MVC 5-Projekt genommen und WebMatrix SimpleMembershipProvider mithilfe von SimpleSecurity , einem Open Source-Projekt, das SimpleMembership von Ihrer MVC-Anwendung entkoppelt, in das Projekt integriert . Bisher bin ich in der Lage, die Datenbank zu erstellen, zu setzen und mich an- und abzumelden. Ich plane, dieser Referenzanwendung weitere Funktionen hinzuzufügen, z. B. eine E-Mail-Bestätigung und verschiedene Tests. Wenn ich fertig bin, werde ich den Quellcode im SimpleSecurity-Projekt veröffentlichen

Wenn ich raten müsste, könnte Ihr Problem mit dem Upgrade-Prozess sein. Welchen Prozess haben Sie unternommen, um Ihr MVC 4-Projekt auf MVC 5 zu aktualisieren? Haben Sie diesen Prozess verfolgt ? Welche Version der WebMatrix-Assemblys verwenden Sie? Welche Version von Visual Studio verwenden Sie? Ich verwende Version 2.0.0.0 von WebMatrix und Visual Studio 2013 RC.


Update (25.10.2013)

Ich setzte mein Experiment mit dem Hinzufügen von SimpleMembership zu einem MVC 5-Projekt fort und irgendwo auf der Linie brach es und ich erhielt die gleichen Ergebnisse wie @Sixten Otto. Ich habe nicht inkrementell getestet, als ich Dinge hinzugefügt habe, aber ich bin misstrauisch, dass dies möglicherweise passiert ist, als ich die Web-API-Assemblys installiert habe. Sie werden beim Erstellen eines neuen MVC 5-Projekts nicht standardmäßig installiert.

Ich habe den Fehler weiter untersucht und bin auf diese Qualitätssicherung mit dem Titel " Versuch durch transparente Sicherheitsmethode 'WebMatrix.WebData.PreApplicationStartCode.Start ()' " gestoßen . Dies ist eine alte Qualitätssicherung, und ursprünglich hat jemand denselben Fehler beim Upgrade einer MVC 3-App auf MVC 4 erhalten. In letzter Zeit haben jedoch Leute Antworten zum Upgrade auf MVC 5 hinzugefügt, und eine der Antworten hat für mich funktioniert. Die Lösung für mich war die Installation des NuGet-Pakets Microsoft.AspNet.WebHelpers . Nach der Installation dieses Pakets hat alles gut funktioniert.

Ein Hinweis zu meinen Untersuchungen zur Migration auf die neue ASP.NET-Identität ist, dass sie nicht denselben Kennwort-Hash verwenden, was das Verschieben alter Mitglieder in eine von ASP.NET Identity verwendete Datenbank ausschließt. ASP.NET Identity scheint sich derzeit in einem echten Wandel zu befinden. Vielleicht werden sie eine Lösung dafür finden.


Update (16.02.14)

Ich habe fälschlicherweise berichtet, dass der Hash-Algorithmus für Kennwörter in SimpleMembership und ASP.NET Identity unterschiedlich war. Ich nahm dies basierend auf einer visuellen Überprüfung der Hash-Passwörter an, wobei angenommen wurde, dass nur das Hash-Passwort in den Feldern war. Nach weiteren Recherchen stellte ich fest, dass SimpleMembership die System.Web.Helpers.Crypto-Klasse zum Hashing des Kennworts verwendet und dass im Kennwortfeld ein 256-Bit-Unterschlüssel und das Salt gespeichert sind. Mit diesen Informationen habe ich einige Tests durchgeführt, um zu überprüfen, ob ASP.NET Identity Kennwörter überprüfen kann, die von SimpleMembership generiert wurden, und die bestanden wurden. Ich habe versucht herauszufinden, welcher Hash-Algorithmus SimpleMembership verwendet, damit ich einen Kennwort-Hash in ASP.NET Identity einfügen kann, mit dem ich Daten von einer SimpleMembership-Webiste auf eine mit ASP.NET Identity verwendete Webiste migrieren kann.In diesem Artikel werde ich ausführlicher auf den Kennwort-Hash und die Migration der Daten von SimpleMembership zu ASP.NET Identity eingehen .


VS 2012, WebMatrix 2.0.0.0. Befolgen Sie diese Anweisungen (und verlinken Sie auf den gleichen Beitrag in meiner Frage). Hat Ihr leeres Projekt auch eine Web-API enthalten? Können Sie die Sicherheitsausnahme erklären, die ich sehe?
Sixten Otto

Entschuldigung, ich habe den Link in Ihrer Frage verpasst, der derselbe Link ist, auf den ich verwiesen habe. Ich musste diese Anweisungen nicht befolgen, da ich mit einem MVC 5-Projekt begonnen habe. Wenn ich mein leeres Projekt abschließe, enthält es eine Web-API zum Testen eines benutzerdefinierten AuthorizeAttribute. Da ich den von Ihnen vorgenommenen Upgrade-Pfad nicht gewählt habe, habe ich nur überprüft, ob WebMatrix mit MVC 5 in Visual Studio 2013 zusammenarbeiten kann. Es besteht also Hoffnung. Wie für die Sicherheitsausnahme; Sind Sie sicher, dass Ihre Anwendung in vollem Vertrauen ausgeführt wird?
Kevin Junghans

Ich bin nicht: Wie könnte ich das sagen? Nach meinem Verständnis ist dies die Standardeinstellung, und ich habe nichts unternommen, um Sicherheitseinstellungen explizit zu ändern. Lief vor dem Upgrade einwandfrei oder ohne zu versuchen, SimpleMembership zu initialisieren. Wird nur lokal von VS in IIS Express ausgeführt.
Sixten Otto

Es scheint etwas zu bedeuten, volles Vertrauen in MVC 5-Anwendungen zu benötigen, wie in Punkt 4 im Abschnitt "Aktualisieren der Datei web.config der Anwendung" des Artikels angegeben, auf den Sie verwiesen haben. Der angezeigte Fehler kann durch eine Anwendung verursacht werden, die nicht vollständig vertrauenswürdig ausgeführt wird. Überprüfen Sie diese Qualitätssicherung, um festzustellen, ob sie hilfreich ist [ stackoverflow.com/questions/1090494/… .
Kevin Junghans

Ich habe wieder verstanden, dass dies die Standard-Vertrauensstufe war, daher bin ich mir nicht sicher, warum dies nicht der Fall ist. Dies scheint ein direkter anwendbarer Code zu sein, um das "Ist es?" Zu beantworten. Frage, wann ich die Möglichkeit habe, das Experiment erneut durchzuführen: stackoverflow.com/questions/1064274/…
Sixten Otto

30

Wenn Sie den Fehler erhalten

Der Versuch der transparenten Sicherheitsmethode 'WebMatrix.WebData.PreApplicationStartCode.Start ()', auf die sicherheitskritische Methode 'System.Web.WebPages.Razor.WebPageRazorHost.AddGlobalImport (System.String)' zuzugreifen, ist fehlgeschlagen.

Um dies zu beheben, installieren Sie dieses Paket mit dem NuGet-Paketmanager.

Install-Package Microsoft.AspNet.WebHelpers

Danach erhalten Sie wahrscheinlich einen weiteren Fehler

Die Assembly WebMatrix.Data Version 3.0.0.0 kann nicht geladen werden

Um dies zu beheben, installieren Sie dieses Paket mit dem NuGet-Paketmanager.

Install-Package Microsoft.AspNet.WebPages.Data

3

Wir arbeiten derzeit an einem Migrationsdokument für die Migration von Simple Membership zu ASP.NET Identity. Bitte bleiben Sie ein paar Wochen auf dem Laufenden, bis wir dieses Migrationsdokument veröffentlichen. Im Moment müssen Sie Ihr einfaches Mitgliedschaftsschema der Identität zuordnen und Ihren Anwendungscode ändern, um OWIN für SignIN / SIgnOut zu verwenden


Bedeutet dies, dass das vom neuen ASP.NET-Identitätssystem verwendete Kennwort-Hashing mit dem von SimpleMembership identisch ist (oder konfiguriert werden kann)? Im schlimmsten Fall könnten wir die Datenbankänderungen skripten, um die vorhandenen Daten in neue Tabellen und dergleichen zu verschieben. Wenn wir jedoch vorhandene Anmeldeinformationen nicht weiter verwenden können, sind die Schemaänderungen irrelevant.
Sixten Otto

Das Tutorial zur Migration von der älteren SQL-Mitgliedschaft ist beendet. Es sieht so aus, als ob die Lösung darin bestand, einen benutzerdefinierten Hashing-Dienst bereitzustellen, der den Code des älteren Anbieters buchstäblich kopiert und abhängig vom Format der Hash-Kennwortzeichenfolge in der Datenbank entweder diese oder die Standard-Identitätsimplementierung verwendet. Sollten wir davon ausgehen, dass die Lösung für die einfache Mitgliedschaft dieselbe sein wird? (Vermutlich ist es gut, dass der WebMatrix-Quellcode öffentlich ist, oder?)
Sixten Otto

Fortschritte bei diesem Dokument? Es war viel mehr als "ein paar Wochen" und der einzige Migrationsleitfaden, den ich gesehen habe, ist einer für die Migration von SQL Membership - nicht von SimpleMembership.
Pando

Wir haben ein Beispiel veröffentlicht, wie Sie von der einfachen Mitgliedschaft zu ASP.NET Identity migrieren können. aspnet.codeplex.com/SourceControl/latest Wenn Sie sich den Ordner "Identität" in den Quellen ansehen, werden zwei Beispiele angezeigt . Simplemembership MigrationSchemaUpdate zeigt Ihnen, wie Sie eine App mithilfe einer einfachen Mitgliedschaft migrieren und das Schema so ändern, dass es mit der ASP.NET-Identität übereinstimmt. SimpleMembershipMigration zeigt, wie Sie Ihr vorhandenes Schema, das Sie mit Simple Membership erstellt haben, einbinden und die ASP.NET-Identitätsfunktionen verwenden können.
Pranav Rastogi

3

Die obigen Antworten funktionierten erst auf den letzten Webseiten 3.2.3. Eine neue Ausgabe ist für mich aufgetaucht. Das aktuelle Update für mich war das Upgrade auf .Net 4.5.3. Ich habe das aus Frustration herausgefunden. Dieses Problem betrifft nicht nur MVC 5, sondern auch Kern-Webmatrix-Projekte nach dem Upgrade auf Webseiten 3.2.3. Ich denke, es ist ein Framework-Problem, das mit der neuen Microsoft Identity behoben wird. Das aktuelle Update für mich ist unten aufgeführt: Hinweis: Verwenden Sie den Eigenschaftenseiten-Assistenten in Visual Studio, um Ihr Zielframework in .Net Framework 4.5.3 zu ändern. Es wird Ihre web.config aktualisieren

<compilation debug="true" targetFramework="4.5.3">
  <assemblies>
    <add assembly="System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
  </assemblies>
</compilation>

Schritt 1: Installationspaket Microsoft.AspNet.WebHelpers

Schritt 2: Installationspaket Microsoft.AspNet.WebPages.Data

Schritt 3: [Optional] Install-Package Owin

Schritt 4: Ändern Sie targetFramework über das Dialogfeld Eigenschaftenseiten in .Net 4.5.3

Geben Sie hier die Bildbeschreibung ein

[Optional] Ihre Web.Config sollte wie folgt aussehen

    <?xml version="1.0"?>

<configuration>
  <appSettings/>
  <connectionStrings>
    <add connectionString="Server=XTREMEGOSPEL;Database=portfolioDB;Trusted_Connection=True" name="portDB" providerName="System.Data.SqlClient"/>
  </connectionStrings>
  <!--
    For a description of web.config changes see http://go.microsoft.com/fwlink/?LinkId=235367.

    The following attributes can be set on the <httpRuntime> tag.
      <system.Web>
        <httpRuntime targetFramework="4.5" />
      </system.Web>
  -->
  <system.web>
    <compilation debug="true" targetFramework="4.5.3">
      <assemblies>
        <add assembly="System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
      </assemblies>
    </compilation>
    <httpRuntime targetFramework="4.5" maxRequestLength="2097151"/>
    <authentication mode="Forms">
      <forms timeout="1440"/>
    </authentication>
    <sessionState timeout="1440"/>
    <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/>
  </system.web>
  <system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="4294967295"/>
      </requestFiltering>
    </security>
  </system.webServer>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

1

Ich habe das gleiche Problem, nicht an meinem lokalen Computer, aber die Live-Site hatte das.

Ich habe die folgenden Zeilen aus der Webkonfiguration entfernt und es funktioniert jetzt.

<dependentAssembly>
   <assemblyIdentity name="System.Web.WebPages.Razor" publicKeyToken="31bf3856ad364e35" />
   <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.