web-dev-qa-db-de.com

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

Wir haben eine vorhandene Anwendung, die auf ASP.NET MVC 4 & Web API basiert. Die Administratorteile der Site verwenden die einfache Mitgliedschaft. Ich möchte die Anwendung auf MVC 5/Web API 2 aktualisieren, um einige der neuen Funktionen nutzen zu können, die hinzugefügt wurden. Aber es sieht so aus, als ob sie inkompatibel wären.

Insbesondere nach der Installation der RC-Pakete von NuGet in einem der Projekte in meiner Projektmappe und Aktualisierung der web.config-Informationen stürzt die Anwendung während des Startvorgangs in der Zeile ab, die WebSecurity.InitializeDatabaseConnection() aufruft. mit dieser 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 der gleichen 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 für WebMatrix nichts Besonderes.

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

UPDATE (11. Oktober)

Ich habe es gerade noch einmal mit einem neuen Checkout des aktuellen Trunks unserer App versucht. Ich verwende Visual Studio 2012, befolge aber ansonsten die Anweisungen von MS zum Aktualisieren eines vorhandenen Projekts. Nach dem Update auf MVC 5/Web API 2/EF 6 startete die App und lief einwandfrei.

Es gab keine expliziten Vertrauensvoraussetzungen für den zu entfernenden web.config. Ich habe den Code von diese Frage zu Global.asax.cs Hinzugefügt und es wird berichtet, dass die App mit vollem Vertrauen ausgeführt wird (in IIS Express, nur F5- aus VS).

Wird derselbe Aufruf erneut zu InitializeDatabaseConnection() hinzugefügt, stirbt er mit genau der gleichen Ausnahme.

LÖSUNG (28 Okt)

Als ich die Lösung in @ Kevins Update vom Freitag ausprobierte, stellte ich fest, dass es funktioniert. Es war wirklich seltsam für mich, dass das Hinzufügen dieses scheinbar nicht verwandten Pakets diese Sicherheitsprobleme lösen würde, und sogar mehr seltsam, nachdem ich das Paket aus meiner Lösung entfernt hatte, und es funktionierte weiter.

Bei genauerer Betrachtung des Vorgangs wurde mir klar, dass der Grund für die Behebung des Problems recht einfach ist: Das Paket Microsoft.AspNet.WebHelpers Enthält zwei Abhängigkeiten, die meiner Lösung hinzugefügt wurden: Microsoft.AspNet.WebPages.Data Und Microsoft.AspNet.WebPages.WebData. Microsoft hat die WebMatrix-Klassen in neue Pakete verschoben.

Also fügte das Hilfspaket das Problem hinzu, nicht wegen irgendetwas, was es tat, sondern weil dazu führte, dass aktualisierte Versionen der defekten Assemblys hinzugefügt wurden meine Lösung. Die Lösung für die anfängliche Inkompatibilität besteht darin, diese neuen Pakete zu installieren, wenn Sie alles andere von NuGet aus aktualisieren:

Install-Package Microsoft.AspNet.WebPages.WebData

UPDATE (13. Mai 2015)

Es wurde mir 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 Sie jedoch ein Fehler beim Erstellen erhalten oder NuGet die Abhängigkeit nicht hinzufügt, kann dies hilfreich sein.

68
Sixten Otto

WebMatrix ist mit MVC 5 kompatibel.

Was ich getan habe, war, ein leeres MVC 5-Projekt zu nehmen und WebMatrix SimpleMembershipProvider mit SimpleSecurity , einem Open-Source-Projekt, das SimpleMembership von Ihrer MVC-Anwendung entkoppelt zu integrieren. Bisher bin ich in der Lage, die Datenbank zu erstellen, sie zu erstellen 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 Project veröffentlichen

Wenn ich raten müsste, könnte Ihr Problem beim Upgrade-Prozess liegen. Wie haben Sie Ihr MVC 4-Projekt auf MVC 5 aktualisiert? Hast du 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 Strecke 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 genauer untersucht und bin auf diese QS mit dem Titel " Versuch mit der transparenten Sicherheitsmethode 'WebMatrix.WebData.PreApplicationStartCode.Start ()' " gestoßen. Dies ist eine alte Qualitätssicherung, und ursprünglich wurde beim Upgrade einer MVC 3-App auf MVC 4 derselbe Fehler gemeldet. In letzter Zeit wurden jedoch Antworten zum Upgrade auf MVC 5 hinzugefügt, und eine der Antworten funktionierte für mich. Die Lösung für mich war die Installation des NuGet-Pakets Microsoft.AspNet.WebHelpers. Nach der Installation dieses Pakets funktionierte alles einwandfrei.

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. Die ASP.NET-Identität scheint sich derzeit in einem echten Wandel zu befinden, sodass sie möglicherweise eine Lösung dafür finden.


Update (16.02.14)

Ich habe fälschlicherweise gemeldet, dass der Hash-Algorithmus für Kennwörter in SimpleMembership und ASP.NET Identity unterschiedlich war. Ich nahm dies an, basierend auf einer visuellen Überprüfung der gehashten Passwörter, unter der Annahme, dass sich nur das gehashte Passwort in den Feldern befand. Nach weiteren Recherchen stellte ich fest, dass SimpleMembership die System.Web.Helpers.Crypto-Klasse zum Hashing des Kennworts verwendet und dass im Kennwortfeld tatsächlich ein 256-Bit-Unterschlüssel und das Salt gespeichert sind. Mit diesen Informationen führte ich einige Tests durch, um zu überprüfen, ob ASP.NET Identity Kennwörter überprüfen kann, die von SimpleMembership generiert wurden. Ich habe versucht herauszufinden, welcher Hash-Algorithmus SimpleMembership verwendet, damit ich einen Kennwort-Hasher in ASP.NET Identity einfügen kann, mit dem ich Daten von einer SimpleMembership-Website auf eine mit ASP.NET Identity migrieren kann. Es stellt sich heraus, dass es nicht notwendig ist. Ich spreche über den Passwort-Hash und wie man die Daten von SimpleMembership zu ASP.NET Identity ausführlicher in diesem Artikel migriert .

36
Kevin Junghans

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 NuGet Package Manager.

Install-Package Microsoft.AspNet.WebHelpers

Danach erhalten Sie wahrscheinlich einen weiteren Fehler

WebMatrix.Data-Assembly der Version 3.0.0.0 kann nicht geladen werden

um dies zu beheben, installieren Sie dieses Paket mit NuGet Package Manager.

Install-Package Microsoft.AspNet.WebPages.Data
30
Anushka

Die obigen Antworten haben erst auf den letzten Webseiten 3.2.3 funktioniert. Eine neue Ausgabe ist für mich aufgetaucht. Das aktuelle Update für mich war ein Upgrade auf .Net 4.5.3. Ich fand das aus Frustration heraus. Dieses Problem betrifft nicht nur MVC 5, sondern auch die wichtigsten Webmatrix-Projekte nach dem Upgrade auf Webseiten 3.2.3. Ich denke, es ist ein Framework-Problem, das mit der neuen Microsoft-Identität behoben wird. Das aktuelle Update für mich lautet wie folgt: Hinweis: Verwenden Sie den Assistenten für Eigenschaftenseiten in Visual Studio, um Ihr Zielframework auf .Net Framework 4.5.3 zu ändern. Es aktualisiert Ihre web.config

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

Schritt 1: Install-Package Microsoft.AspNet.WebHelpers

Schritt 2: Install-Package Microsoft.AspNet.WebPages.Data

Schritt 3: [Optional] Install-Package Owin

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

enter image description here

[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>
3
Ifeanyi Chukwu

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

3
pranav rastogi

Ich hatte 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>
1
Fatih Çelik