webapi net mvc ihttpactionresult from asp asax applicationuser c# asp.net-mvc simplemembership asp.net-mvc-5 asp.net-identity

c# - mvc - system web asp net core



¿Es ASP.NET MVC 5 incompatible con WebMatrix SimpleMembershipProvider? (5)

Tenemos una aplicación existente basada en ASP.NET MVC 4 y API web. Las partes administrativas del sitio usan membresía simple. Estoy interesado en actualizar la aplicación a MVC 5 / Web API 2, para aprovechar algunas de las nuevas características que se han agregado. Pero parece que podrían ser incompatibles.

Específicamente, después de instalar los paquetes RC de NuGet en uno de los proyectos de mi solución y de actualizar la información de web.config , la aplicación comienza a WebSecurity.InitializeDatabaseConnection() durante el inicio en la línea que llama a WebSecurity.InitializeDatabaseConnection() , con esta excepción:

[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

Otros proyectos en la misma solución que usan membresía simple que no he actualizado continúan funcionando bien.

Buscar en Google para obtener más información genera muchos éxitos para esa excepción, por supuesto, pero nada particular para WebMatrix.

FWIW: Sé que Microsoft ha presentado (otra más) membresía y solución de identidad , pero a menos que haya una manera de usar eso con las tablas de Membresía simple existentes o una ruta de migración perfecta para todos nuestros datos de usuario existentes, esa no es realmente una opción para nosotros.

ACTUALIZACIÓN (11 de octubre)

Lo intenté de nuevo con una nueva comprobación del tronco actual de nuestra aplicación. Estoy usando Visual Studio 2012, pero de lo contrario seguí las instrucciones de MS para actualizar un proyecto existente. Después de actualizar a MVC 5 / Web API 2 / EF 6, la aplicación arrancó y funcionó perfectamente.

No hubo requisitos de confianza explícitos en el web.config para eliminar. Agregué el código de esta pregunta a Global.asax.cs e informa que la aplicación se ejecuta con plena confianza (en IIS Express, solo F5-ed de VS).

Al volver a agregar la misma llamada a InitializeDatabaseConnection() , comienza a morir con la misma excepción.

SOLUCIÓN (28 de octubre)

Al probar la solución en la actualización de @ Kevin del viernes, descubrí que funciona. Fue realmente extraño para mí que agregar este paquete aparentemente no relacionado resolvería estos problemas de seguridad, y aún más extraño después de que eliminé el paquete de mi solución, y siguió funcionando .

Mirando más de cerca lo que sucedía, me di cuenta de que la razón por la cual esto soluciona el comportamiento es bastante simple: el paquete Microsoft.AspNet.WebHelpers tiene dos dependencias que se estaban agregando a mi solución: Microsoft.AspNet.WebPages.Data y Microsoft.AspNet.WebPages.WebData . Microsoft ha movido las clases de WebMatrix a nuevos paquetes.

Así que agregué que el paquete de ayudantes solucionó el problema, no por lo que estaba haciendo, sino porque estaba causando que las versiones actualizadas de los ensamblajes rotos se agregaran a mi solución. La solución a la incompatibilidad inicial, entonces, es instalar estos paquetes nuevos al actualizar todo lo demás de NuGet:

Install-Package Microsoft.AspNet.WebPages.WebData

ACTUALIZACIÓN (13 de mayo de 2015)

Se me sugirió que también podría necesitar instalar manualmente el segundo paquete nuevo:

Install-Package Microsoft.AspNet.WebPages.Data

Esto no debería ser necesario, ya que este paquete es una dependencia explícita del primero, y NuGet debe ser lo suficientemente inteligente como para instalar ambos. Pero si obtiene un error al compilar, o no ve NuGet agregar la dependencia, podría ayudarlo.


Actualmente estamos trabajando en un documento de migración para migrar de Membresía simple a Identidad ASP.NET. Estén atentos durante un par de semanas hasta que presionemos este documento de migración. Por ahora, debe asignar su esquema de Membresía simple a Identity y cambiar el código de su aplicación para usar OWIN para SignIN / SIgnOut.


Las respuestas anteriores funcionaron no hasta páginas web recientes 3.2.3. Un nuevo problema apareció para mí. La solución actual para mí fue actualizar a .NET 4.5.3. Me di cuenta de esto por frustración. Este problema no solo afecta a MVC 5, sino también a los proyectos centrales de Webmatrix luego de actualizar a las páginas web 3.2.3. Creo que es un problema de marco que se solucionará con la nueva identidad de Microsoft. La solución actual para mí es la siguiente: Nota: utilice el asistente de páginas de propiedades en Visual Studio para cambiar su marco de trabajo objetivo a .Net Framework 4.5.3. Actualizará su web.config

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

Paso 1: Install-Package Microsoft.AspNet.WebHelpers

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

Paso 3: [Opcional] Install-Package Owin

Paso 4: cambie targetFramework a .Net 4.5.3 a través del cuadro de diálogo Páginas de propiedades

[Opcionalmente] Su Web.Config debería verse como la siguiente

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


Si obtiene el error

Intento por el método transparente de seguridad ''WebMatrix.WebData.PreApplicationStartCode.Start ()'' para acceder al método crítico de seguridad ''System.Web.WebPages.Razor.WebPageRazorHost.AddGlobalImport (System.String)'' falló.

Para arreglar esto instale este paquete usando el administrador de paquetes NuGet.

Install-Package Microsoft.AspNet.WebHelpers

Después de eso, probablemente obtendrá otro error

No se puede cargar el ensamblado WebMatrix.Data versión 3.0.0.0

para arreglar esta instalación este paquete usando el administrador de paquetes NuGet.

Install-Package Microsoft.AspNet.WebPages.Data


Tengo el mismo problema, no en mi computadora local, pero el sitio en vivo estaba teniendo eso.

Eliminé las líneas siguientes de la configuración web y está funcionando ahora.

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


WebMatrix es compatible con MVC 5.

Lo que hice fue tomar un proyecto MVC 5 vacío e incorporar WebMatrix SimpleMembershipProvider en él utilizando SimpleSecurity , un proyecto de código abierto que desacopla a SimpleMembership de su aplicación MVC . Hasta ahora soy capaz de crear la base de datos, inicializarla e ingresar y salir. Planeo agregar otras funciones a esta aplicación de referencia, como confirmación de correo electrónico y varias pruebas. Cuando termine , publicaré el código fuente en el proyecto SimpleSecurity

Si tuviera que adivinar, su problema puede ser con el proceso de actualización. ¿Qué proceso tomó para actualizar su proyecto MVC 4 a MVC 5? ¿Sigues este proceso ? ¿Qué versión de los ensambles de WebMatrix estás usando? ¿Qué versión de Visual Studio estás usando? Estoy usando la versión 2.0.0.0 de WebMatrix y Visual Studio 2013 RC.

Actualización (25/10/2013)

Continué mi experimento añadiendo SimpleMembership a un proyecto de MVC 5 y en algún momento se rompió y obtuve los mismos resultados que @Sixten Otto. No hice pruebas de forma incremental ya que agregué cosas, pero sospecho que puede haber sucedido cuando instalé los ensamblados de la API web. No se instalan por defecto cuando se crea un nuevo proyecto MVC 5.

Investigué un poco más sobre el error y me encontré con este control de calidad titulado " Intento por método transparente de seguridad" WebMatrix.WebData.PreApplicationStartCode.Start () '' ". Este es un antiguo control de calidad y originalmente alguien estaba obteniendo el mismo error al actualizar una aplicación MVC 3 a MVC 4. Pero recientemente las personas han estado agregando respuestas con respecto a la actualización a MVC 5 y una de las respuestas funcionó para mí. La solución para mí fue instalar el paquete NuGet Microsoft.AspNet.WebHelpers . Después de instalar este paquete todo funcionó bien.

Una nota sobre mi investigación sobre la migración a la nueva Identidad ASP.NET es que no usan el mismo hash de contraseña, lo que impide mover miembros antiguos a una base de datos utilizada por ASP.NET Identity. ASP.NET Identity parece tener un flujo real en este momento, así que tal vez encuentren una solución para esto.

Actualización (16/02/14)

Informé erróneamente que el algoritmo hash para contraseñas era diferente en SimpleMembership y ASP.NET Identity. Supuse esto basado en una inspección visual de las contraseñas hash, suponiendo que era solo la contraseña hash que estaba en los campos. Después de seguir investigando, descubrí que SimpleMembership usa la clase System.Web.Helpers.Crypto para el hash de la contraseña y que lo que se almacena en el campo de la contraseña es en realidad una subclave de 256 bits y la sal. Con esa información realicé algunas pruebas para validar que ASP.NET Identity puede verificar las contraseñas generadas por SimpleMembership, y se aprobó. Estaba intentando averiguar qué algoritmo hash usó SimpleMembership para poder agregar un identificador de contraseñas en ASP.NET Identity que me permitiera migrar datos de un sitio web SimpleMembership a uno que utilizara ASP.NET Identity. Resulta que no es necesario. Hablo sobre el hash de contraseñas y cómo migrar los datos de SimpleMembership a ASP.NET Identity en más detalle en este artículo .