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