web-dev-qa-db-fra.com

ASP.NET MVC 5 est-il incompatible avec WebMatrix SimpleMembershipProvider?

Nous avons une application existante qui a été construite sur ASP.NET MVC 4 et l'API Web. Les parties administratives du site utilisent l'adhésion simple. Je suis intéressé par la mise à niveau de l'application vers MVC 5/Web API 2, pour profiter de certaines des nouvelles fonctionnalités qui ont été ajoutées. Mais il semble qu'ils pourraient être incompatibles.

Plus précisément, après avoir installé les packages RC de NuGet dans l'un des projets de ma solution, et mise à jour des informations web.config , l'application commence à mourir au démarrage sur la ligne qui appelle WebSecurity.InitializeDatabaseConnection(), à cette exception près:

[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

D'autres projets dans la même solution utilisant l'adhésion simple que j'ai mis à niveau pas continuent de bien fonctionner.

La recherche sur Google pour plus d'informations génère de nombreux hits pour cette exception, bien sûr, mais rien de particulier à WebMatrix.

FWIW: Je sais que Microsoft a introduit (encore une autre) solution d'appartenance et d'identité , mais à moins qu'il n'y ait un moyen de l'utiliser avec les tables d'appartenance simple existantes, ou un chemin de migration transparent pour tous nos utilisateurs existants données, ce n'est pas vraiment une option pour nous.

MISE À JOUR (11 octobre)

Je viens de réessayer avec une nouvelle vérification du coffre actuel de notre application. J'utilise Visual Studio 2012, mais sinon, j'ai suivi les instructions de MS pour mettre à niveau un projet existant. Après la mise à jour vers MVC 5/Web API 2/EF 6, l'application a démarré et s'est très bien déroulée.

Il n'y avait aucune exigence de confiance explicite dans le web.config À supprimer. J'ai ajouté le code de cette question à Global.asax.cs, Et il indique que l'application fonctionne en toute confiance (dans IIS Express, juste F5- ed de VS).

En rajoutant le même appel à InitializeDatabaseConnection(), il commence à mourir avec exactement la même exception.

SOLUTION (28 oct.)

En essayant la solution dans la mise à jour de @ Kevin de vendredi, j'ai trouvé que cela fonctionne. C'était vraiment étrange pour moi que l'ajout de ce package apparemment sans rapport résoudrait ces problèmes de sécurité, et même plus étrange après avoir supprimé le package de ma solution, et cela a continué à fonctionner.

En examinant de plus près ce qui se passait, j'ai réalisé que la raison pour laquelle cela corrige le comportement est assez simple: le package Microsoft.AspNet.WebHelpers A deux dépendances qui ont été ajoutées à ma solution: Microsoft.AspNet.WebPages.Data Et Microsoft.AspNet.WebPages.WebData. Microsoft a déplacé les classes WebMatrix dans de nouveaux packages.

Ainsi, le package helpers a corrigé le problème, non pas à cause de quelque chose qu'il faisait, mais parce que , il provoquait l'ajout de versions mises à jour des assemblages cassés à ma solution. La solution à l'incompatibilité initiale consiste alors à installer ces nouveaux packages lors de la mise à jour de tout le reste à partir de NuGet:

Install-Package Microsoft.AspNet.WebPages.WebData

MISE À JOUR (13 mai 2015)

Il a été suggéré à moi que vous devrez peut-être également installer manuellement le deuxième nouveau package:

Install-Package Microsoft.AspNet.WebPages.Data

Cela ne devrait pas être nécessaire, car ce package est ne dépendance explicite du premier, et NuGet devrait être suffisamment intelligent pour installer les deux. Mais si vous obtenez ne erreur lors de la construction , ou si vous ne voyez pas NuGet ajouter la dépendance, cela pourrait vous aider.

68
Sixten Otto

WebMatrix est compatible avec MVC 5.

Ce que j'ai fait était de prendre un projet MVC 5 vide et d'y incorporer WebMatrix SimpleMembershipProvider en utilisant SimpleSecurity , un projet open source qui dissocie SimpleMembership de votre application MVC . Jusqu'à présent, je suis en mesure de créer la base de données, de l'amorcer et de me connecter et de me déconnecter. Je prévois d'ajouter d'autres fonctionnalités à cette application de référence, telles que la confirmation par e-mail et divers tests. Quand j'aurai fini, je posterai le code source dans le Projet SimpleSecurity

Si je devais deviner, votre problème pourrait être lié au processus de mise à niveau. Quel processus avez-vous suivi pour mettre à niveau votre projet MVC 4 vers MVC 5? Avez-vous suivi ce processus ? Quelle version des assemblys WebMatrix utilisez-vous? Quelle version de Visual Studio utilisez-vous? J'utilise la version 2.0.0.0 de WebMatrix et Visual Studio 2013 RC.


Mise à jour (25/10/2013)

J'ai continué mon expérience avec l'ajout de SimpleMembership à un projet MVC 5 et quelque part le long de la ligne, il s'est cassé et j'ai obtenu les mêmes résultats que @Sixten Otto. Je n'ai pas effectué de test incrémentiel en ajoutant des éléments, mais je soupçonne que cela s'est peut-être produit lorsque j'ai installé les assemblys d'API Web. Ils ne sont pas installés par défaut lors de la création d'un nouveau projet MVC 5.

J'ai fait quelques recherches supplémentaires sur l'erreur et suis tombé sur ce contrôle qualité intitulé " Tentative par la méthode transparente de sécurité 'WebMatrix.WebData.PreApplicationStartCode.Start ()' ". Il s'agit d'un ancien contrôle qualité et à l'origine, quelqu'un obtenait cette même erreur lors de la mise à niveau d'une application MVC 3 vers MVC 4. Mais récemment, des gens ont ajouté des réponses concernant la mise à niveau vers MVC 5 et l'une des réponses a fonctionné pour moi. La solution pour moi a été d'installer le package NuGet Microsoft.AspNet.WebHelpers. Après avoir installé ce package, tout a bien fonctionné.

Une note sur mes recherches sur la migration vers la nouvelle identité ASP.NET est qu'elles n'utilisent pas le même hachage de mot de passe, ce qui empêche de déplacer les anciens membres dans une base de données utilisée par ASP.NET Identity. L'identité ASP.NET semble être en pleine évolution en ce moment, alors peut-être qu'ils trouveront une solution pour cela.


Mise à jour (16/02/14)

J'ai signalé à tort que l'algorithme de hachage pour les mots de passe était différent dans SimpleMembership et ASP.NET Identity. J'ai supposé cela basé sur une inspection visuelle des mots de passe hachés, en supposant que c'était juste le mot de passe haché qui était dans les champs. Après d'autres recherches, j'ai découvert que SimpleMembership utilise la classe System.Web.Helpers.Crypto pour hacher le mot de passe et ce qui est stocké dans le champ de mot de passe est en fait une sous-clé de 256 bits et le sel. Avec ces informations, j'ai effectué des tests pour valider que l'identité ASP.NET peut vérifier les mots de passe générés par SimpleMembership, et cela a réussi. J'essayais de savoir quel algorithme de hachage SimpleMembership utilisé afin de pouvoir brancher un hacheur de mot de passe dans ASP.NET Identity qui me permettrait de migrer les données d'un site Web SimpleMembership vers un autre qui utilisait ASP.NET Identity. Il s'avère que ce n'est pas nécessaire. Je parle du hachage de mot de passe et de la façon de migrer les données de SimpleMembership vers ASP.NET Identity plus en détail dans cet article .

36
Kevin Junghans

Si vous obtenez l'erreur

La tentative par la méthode transparente de sécurité "WebMatrix.WebData.PreApplicationStartCode.Start ()" pour accéder à la méthode critique de sécurité "System.Web.WebPages.Razor.WebPageRazorHost.AddGlobalImport (System.String)" a échoué.

Pour résoudre ce problème, installez ce package à l'aide du gestionnaire de packages NuGet.

Install-Package Microsoft.AspNet.WebHelpers

Après cela, vous obtiendrez probablement une autre erreur

Impossible de charger l'assembly WebMatrix.Data version 3.0.0.0

pour résoudre ce problème, installez ce package à l'aide du gestionnaire de packages NuGet.

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

Les réponses ci-dessus n'ont pas fonctionné avant les pages Web récentes 3.2.3. Un nouveau problème est apparu pour moi. Le correctif actuel pour moi était la mise à niveau vers .Net 4.5.3. J'ai compris cela par frustration. Ce problème n'affecte pas seulement MVC 5 mais les principaux projets Webmatrix après la mise à niveau vers les pages Web 3.2.3. Je pense que c'est un problème de cadre qui sera résolu avec la nouvelle identité Microsoft. Le correctif actuel pour moi est ci-dessous: Remarque: veuillez utiliser l'assistant des pages de propriétés dans Visual Studio pour changer votre framework cible en .Net Framework 4.5.3. Il mettra à jour votre web.config

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

Étape 1: package d'installation Microsoft.AspNet.WebHelpers

Étape 2: package d'installation Microsoft.AspNet.WebPages.Data

Étape 3: [Facultatif] Owin du package d'installation

Étape 4: changez targetFramework en .Net 4.5.3 via la boîte de dialogue Pages de propriétés

enter image description here

[Facultatif] Votre Web.Config devrait ressembler à ce qui suit

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

Nous travaillons actuellement sur un document de migration pour la migration de l'appartenance simple à l'identité ASP.NET. Veuillez rester à l'écoute pendant quelques semaines jusqu'à ce que nous poussions ce document de migration. Pour l'instant, vous devez mapper votre schéma d'adhésion simple à Identity et modifier le code de votre application pour utiliser OWIN pour SignIN/SIgnOut

3
pranav rastogi

J'ai eu le même problème, pas sur mon ordinateur local, mais le site en direct rencontrait cela.

J'ai supprimé les lignes ci-dessous de la configuration Web et cela fonctionne maintenant.

<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