Является ли 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.Data​​p >

Шаг 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>