Есть ASP.NET MVC 5 несовместим с WebMatrix SimpleMembershipProvider?
у нас есть существующее приложение, которое было построено на ASP.NET MVC 4 & Web API. Административные части сайта используют простое членство. Я заинтересован в обновлении приложения до MVC 5 / Web API 2, чтобы воспользоваться некоторыми из новых функций, которые были добавлены. Но похоже, что они могут быть несовместимы.
в частности, после установки RC-пакетов из NuGet в один из проектов в моем решении и обновление веб.информация о конфигурации, приложение начинает умирать во время запуска на линии, которая вызывает 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
другие проекты в том же решении, используя простое членство, которое у меня есть не обновление продолжает работать просто отлично.
Googling вокруг для получения дополнительной информации оказывается много хитов для этого исключения, конечно, но ничего особенного для WebMatrix.
FWIW: я знаю, что Microsoft представила (еще один) членство и идентичность решение, но если нет способа использовать это с существующими простыми таблицами членства или бесшовным путем миграции для всех наших существующих пользовательских данных, это не совсем вариант для нас.
обновление (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)
It было предложено мне, что вам также может потребоваться вручную установить второй новый пакет:
Install-Package Microsoft.AspNet.WebPages.Data
этой не должен необходимо, потому что этот пакет явная зависимость первой, и NuGet должен быть достаточно умен, чтобы установить оба. Но если вы получаете ошибку при построении или не видите, что NuGet добавляет зависимость, это может помочь вам.
5 ответов:
WebMatrix совместим с MVC 5.
то, что я сделал, это взять пустой проект MVC 5 и включить в него WebMatrix SimpleMembershipProvider с помощью SimpleSecurity, проект с открытым исходным кодом, который отделяет SimpleMembership от вашего приложения MVC. До сих пор я могу создать базу данных, заполнить ее, а также войти и выйти. Я планирую добавить другие функции в это справочное приложение, такие как подтверждение по электронной почте и различные тесты. Когда я сделано я буду размещать исходный код в Проект SimpleSecurity
Если бы мне пришлось угадать, ваша проблема может быть с процессом обновления. Какой процесс Вы предприняли для обновления вашего проекта MVC 4 до MVC 5? вы следили за этим процессом? Какую версию сборок WebMatrix вы используете? Какую версию Visual Studio вы используете? Я использую версию 2.0.0.0 WebMatrix и Visual Studio 2013 RC.
обновление (25.10.2013)
Я продолжил свой эксперимент с добавлением SimpleMembership в проект MVC 5, и где-то по линии он сломался, и я получил те же результаты, что и @Sixten Otto. Я не тестировал постепенно, поскольку я добавил вещи, но я подозреваю, что это могло произойти, когда я установил сборки веб-API. Они не установлены по умолчанию при создании нового проекта MVC 5.
Я сделал еще несколько исследований по ошибке и наткнулся на этот QA под названием"попытка по безопасности прозрачный метод ' WebMatrix.WebData.PreApplicationStartCode.Start ()'". Это старый QA, и первоначально кто-то получал эту же ошибку при обновлении приложения MVC 3 до MVC 4. Но в последнее время люди добавляют ответы в отношении обновления до MVC 5, и один из ответов работал для меня. решение для меня было установить NuGet-пакет Microsoft.сеть САШ.WebHelpers. после установки этого пакета все работало штраф.
заметка о моих исследованиях по миграции на новый ASP.NET идентичность заключается в том, что они не используют один и тот же хэш пароля, что исключает перемещение старых членов в базу данных, используемую ASP.NET личность. ASP.NET идентичность, похоже, находится в реальном потоке прямо сейчас, поэтому, возможно, они придумают решение для этого.
обновление (2/16/14)
Я ошибочно сообщил, что алгоритм хеширования паролей в SimpleMembership и ASP.NET личность. Я предположил это на основе визуального осмотра хэшированных паролей, предполагая, что это был просто хэшированный пароль, который был в полях. После дальнейших исследований я обнаружил, что SimpleMembership использует систему.Сеть.Прислуга.Крипто класс для хэширования пароля и то, что хранится в поле пароля, на самом деле является 256-битным подразделом и солью. С этой информацией я провел несколько тестов, чтобы проверить это ASP.NET Identity может проверять пароли, которые генерируются Простая память, и она прошла. Я пытался выяснить, какой хэш-алгоритм SimpleMembership используется, чтобы я мог подключить пароль hasher in ASP.NET идентификатор, который позволит мне перенести данные из SimpleMembership webiste в тот, который использовал ASP.NET личность. Оказывается, это не нужно. я говорю о хэше пароля и о том, как перенести данные из SimpleMembership в ASP.NET идентичность более подробно в этой статье.
Если вы получаете сообщение об ошибке
попытка прозрачным методом безопасности ‘В WebMatrix.WebData.PreApplicationStartCode.Start()’ для доступа к безопасности критический метод ‘Система.Сеть.страницы.Бритва.WebPageRazorHost.AddGlobalImport (System.Строка’) неудачный.
чтобы исправить это, установите этот пакет с помощью диспетчера пакетов NuGet.
Install-Package Microsoft.AspNet.WebHelpers
после этого , вероятно, вы получите еще одну ошибку
не может в WebMatrix нагрузки.Данные версии 3.0.0.0 сборки
чтобы исправить это, установите этот пакет с помощью диспетчера пакетов NuGet.
Install-Package Microsoft.AspNet.WebPages.Data
в настоящее время мы работаем над документом миграции для перехода от простого членства к ASP.NET личность. Пожалуйста, следите за обновлениями в течение нескольких недель, пока мы не нажмем этот документ миграции. Теперь вам нужно сопоставить свою простую схему членства с Identity и изменить код приложения, чтобы использовать OWIN для входа / выхода
вышеуказанные ответы не работали до последних страниц 3.2.3. Для меня появился новый выпуск. Текущее исправление для меня было путем обновления до .Net 4.5.3. Я понял это из-за разочарования. Эта проблема не только влияет на MVC 5, но и на основные проекты Webmatrix после обновления до веб-страниц 3.2.3. Я думаю, что это проблема с фреймворком, которая будет исправлена с помощью нового удостоверения Microsoft. Текущее исправление для меня ниже: Примечание: для изменения параметров используйте мастер страниц свойств в visual studio целевая платформа для .Net Framework 4.5.3. Он будет обновлять ваш веб.конфигурации
<compilation debug="true" targetFramework="4.5.3"> <assemblies> <add assembly="System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> </assemblies> </compilation>
Шаг 1: Установка-Пакет Microsoft.сеть САШ.WebHelpers
Шаг 2: Установка Пакета Microsoft.сеть САШ.страницы.Данные
Шаг 3: [Необязательно] Install-Package Owin
Шаг 4: измените targetFramework на .Net 4.5.3 через диалоговое окно страницы свойств
[Дополнительно] Веб.Конфигурация должна выглядеть следующим образом ниже
<?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>
У меня такая же проблема, не на моем локальном компьютере, но живой сайт есть.
Я удалил ниже строки из web config и он работает сейчас.
<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>