Является ли ASP.NET MVC 5 несовместимым с WebMatrix SimpleMembershipProvider?
У нас есть существующее приложение, которое было создано на ASP.NET MVC 4 и веб-API. Административные части сайта используют Simple Membership. Я заинтересован в обновлении приложения до MVC 5/Web API 2, чтобы воспользоваться некоторыми новыми добавленными функциями. Но похоже, что они могут быть несовместимыми.
В частности, после установки пакетов RC из NuGet в один из проектов в моем решении и обновление информации web.config, приложение начинает умирать во время запуска в строке, которая вызывает WebSecurity.InitializeDatabaseConnection()
, с этим исключением:
[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
Другие проекты в одном решении с использованием Simple Membership, которые я не обновил, продолжают работать нормально.
Google для получения дополнительной информации отображает множество хитов для этого исключения, конечно, но ничего особенного для WebMatrix.
FWIW: Я знаю, что Microsoft внедрила (еще одно) решение для членства и идентификации, но если нет способа использовать это с существующих таблиц Simple Membership или бесшовного пути миграции для всех наших существующих пользовательских данных, что на самом деле не является для нас вариантом.
ОБНОВЛЕНИЕ (11 октября)
Я просто попробовал это снова со свежей проверкой текущего ствола нашего приложения. Я использую Visual Studio 2012, но в противном случае выполнял инструкции от MS для обновления существующего проекта. После обновления до MVC 5/Web API 2/EF 6, приложение запустило режим "просто".
В web.config
для удаления не было явных требований доверия. Я добавил код из этого вопроса в Global.asax.cs
, и он сообщает, что приложение работает с полным доверием (в IIS Express, только F5-ed из VS).
Повторное добавление одного и того же вызова к InitializeDatabaseConnection()
, оно начинает умирать с тем же самым исключением.
РЕШЕНИЕ (28 октября)
Попробовав решение в обновлении @Kevin с пятницы, я обнаружил, что он работает. Мне было очень странно, что добавление этого явно несвязанного пакета решит эти проблемы безопасности, и даже более странно после того, как я удалил пакет из своего решения и продолжал работать.
Внимательно изучив происходящее, я понял, что причина этого исправления довольно проста: пакет Microsoft.AspNet.WebHelpers
имеет две зависимости, которые были добавлены в мое решение: Microsoft.AspNet.WebPages.Data
и Microsoft.AspNet.WebPages.WebData
. Microsoft переместила классы WebMatrix в новые пакеты.
Итак, добавленный пакет помощников исправил проблему, а не из-за чего-либо, но поскольку он вызывал обновленные версии сломанных сборок, чтобы добавить в мое решение. Таким образом, решение первоначальной несовместимости заключается в установке этих новых пакетов при обновлении всего остального от NuGet:
Install-Package Microsoft.AspNet.WebPages.WebData
ОБНОВЛЕНИЕ (13 мая 2015 г.)
Было предложено , что вам также может понадобиться вручную установить второй новый пакет:
Install-Package Microsoft.AspNet.WebPages.Data
Это не обязательно, потому что этот пакет явная зависимость от первого, и NuGet должен быть достаточно умным, чтобы установить оба. Но если вы получаете ошибку при создании или не видите, что NuGet добавляет зависимость, это может вам помочь.
Ответы
Ответ 1
WebMatrix совместим с MVC 5.
Что я сделал, так это взять пустой проект MVC 5 и включить в него WebMatrix SimpleMembershipProvider с помощью SimpleSecurity, проект с открытым исходным кодом, который отделяет SimpleMembership от вашего приложения MVC. Пока я могу создать базу данных, засеять ее и войти и выйти. Я планирую добавить другие функции в это справочное приложение, например, подтверждение электронной почты и различные тесты. Когда я закончил, я отправлю исходный код в SimpleSecurity Project
Если бы мне пришлось угадать, ваша проблема может быть связана с процессом обновления. Какой процесс вы предприняли для обновления вашего проекта MVC 4 до MVC 5? Вы следовали этому процессу? Какую версию сборки WebMatrix вы используете? Какую версию Visual Studio вы используете? Я использую версию 2.0.0.0 для WebMatrix и Visual Studio 2013 RC.
Обновление (10/25/2013)
Я продолжил свой эксперимент с добавлением SimpleMembership в проект MVC 5 и где-то вдоль линии он сломался, и я получил те же результаты, что и @Sixten Otto. Я не тестировал поэтапно, когда добавлял, но я подозреваю, что это могло произойти, когда я установил сборки Web API. Они не устанавливаются по умолчанию при создании нового проекта MVC 5.
Я сделал несколько исследований об ошибке и наткнулся на этот QA под названием "Попытка прозрачным методом безопасности "WebMatrix.WebData.PreApplicationStartCode.Start()" . Это старый QA, и изначально кто-то получал эту же ошибку при обновлении приложения MVC 3 до MVC 4. Но в последнее время люди добавляли ответы в отношении перехода на MVC 5, и один из ответов работал на меня. Решение для меня было установить пакет NuGet Microsoft.AspNet.WebHelpers. После установки этого пакета все работало нормально.
Заметка о моем исследовании миграции на новую идентификационную информацию ASP.NET заключается в том, что они не используют один и тот же хэш пароля, что исключает возможность переноса старых членов в базу данных, используемую ASP.NET Identity. Идентификация ASP.NET, похоже, сейчас в реальном потоке, поэтому, возможно, они придумают решение для этого.
Обновление (2/16/14)
Я ошибочно сообщил, что алгоритм хеширования для паролей отличается от SimpleMembership и ASP.NET Identity. Я предположил, что это основано на визуальной проверке хешированных паролей, предполагая, что это только хэшированный пароль, который был в полях. После дальнейших исследований я обнаружил, что SimpleMembership использует класс System.Web.Helpers.Crypto для хэширования пароля и того, что хранится в поле пароля, на самом деле является 256-разрядным подразделением и солью. С этой информацией я провел несколько тестов, чтобы проверить, что идентификатор ASP.NET может проверять пароли, которые генерируются SimpleMembership, и он прошел. Я пытался выяснить, какой хэш-алгоритм SimpleMembership используется, чтобы я мог подключить хакер пароля в ASP.NET Identity, который позволил бы мне перенести данные с веб-сайта SimpleMembership на тот, который использовал идентификатор ASP.NET. Оказывается, это не обязательно. Я говорю о хэше пароля и о том, как перенести данные из SimpleMembership в ASP.NET Identity более подробно в этой статье.
Ответ 2
Если вы получаете сообщение об ошибке
Попытка прозрачным методом безопасности 'WebMatrix.WebData.PreApplicationStartCode.Start() для доступа к безопасности критический метод "System.Web.WebPages.Razor.WebPageRazorHost.AddGlobalImport(System.String) не удалось.
Чтобы исправить этот пакет, установите его с помощью диспетчера пакетов NuGet.
Install-Package Microsoft.AspNet.WebHelpers
После этого, возможно, вы получите еще одну ошибку
Не удается загрузить сборку WebMatrix.Data версии 3.0.0.0
чтобы исправить этот пакет установки с помощью диспетчера пакетов NuGet.
Install-Package Microsoft.AspNet.WebPages.Data
Ответ 3
В настоящее время мы работаем над переносом doc для перехода от Simple Membership к Identity ASP.NET. Пожалуйста, следите за обновлениями в течение нескольких недель, пока мы не нажмем этот миграционный документ.
Пока вам нужно сопоставить схему Simple Membership с Identity и изменить код приложения для использования OWIN для Signin/SIgnOut
Ответ 4
Вышеуказанные ответы работали только до последних веб-страниц 3.2.3. Новый вопрос появился для меня. Текущее исправление для меня было путем обновления до .Net 4.5.3. Я понял это из-за разочарования. Эта проблема не влияет только на MVC 5, но основные проекты Webmatrix, а также после обновления до веб-страниц 3.2.3. Я думаю, что это проблема с каркасом, которая будет исправлена с помощью новой Microsoft Identity. Текущее исправление для меня ниже:
Примечание. Используйте мастер страниц свойств в visual studio, чтобы изменить целевую структуру на .Net Framework 4.5.3. Он обновит ваш web.config
<compilation debug="true" targetFramework="4.5.3">
<assemblies>
<add assembly="System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
</assemblies>
</compilation>
Шаг 1: Установить пакет Microsoft.AspNet.WebHelpers
Шаг 2: Установить пакет Microsoft.AspNet.WebPages.Datap >
Шаг 3: [Дополнительно] Install-Package Owin
Шаг 4: Измените targetFramework на .Net 4.5.3 через диалоговое окно "Свойства страницы"
![enter image description here]()
[Необязательно] Ваш Web.Config должен выглядеть следующим образом
<?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>
Ответ 5
У меня такая же проблема, но не на моем локальном компьютере, но у этого сайта был сайт.
Я удалил ниже строки из веб-конфигурации и теперь работает.
<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>