Есть 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 68

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 через диалоговое окно страницы свойств

enter image description here

[Дополнительно] Веб.Конфигурация должна выглядеть следующим образом ниже

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