Является ли ASP.NET MVC 5 несовместимым с WebMatrix SimpleMembershipProvider?

У нас есть существующее приложение, созданное на основе ASP.NET MVC 4 и веб-API. Административные части сайта используют простое членство. Я заинтересован в обновлении приложения до 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, которые я не обновил, продолжают нормально работать.

Погуглив дополнительную информацию, вы, конечно, обнаружите множество совпадений для этого исключения, но ничего особенного для 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 из 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 добавляет зависимость, это может вам помочь.


person Sixten Otto    schedule 03.10.2013    source источник
comment
Я хотел бы проголосовать за это более одного раза, спасибо, спасибо, спасибо за то, что вы потрудились документировать свой процесс. Я собирался войти в режим паники. Вы спасли меня от смущения на этой утренней презентации.   -  person Joseph White    schedule 07.11.2013
comment
Мне также пришлось фактически удалить webmatrix из моих ссылок на проекты. Удаление этих пакетов и установка webhelpers не помогли мне.   -  person Beth Whitezel    schedule 10.07.2014
comment
Большое спасибо. Install-Package Microsoft.AspNet.WebPages.WebData работает для меня   -  person ARC    schedule 15.08.2015


Ответы (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 под названием "Attempt безопасным методом 'WebMatrix.WebData.PreApplicationStartCode.Start()'". Это старый QA, и изначально кто-то получал ту же ошибку при обновлении приложения MVC 3 до MVC 4. Но недавно люди добавляли ответы относительно обновления до MVC 5, и один из ответов сработал для меня. Решением для меня была установка пакета NuGet Microsoft.AspNet.WebHelpers. После установки этого пакета все заработало нормально.

Замечание по поводу моего исследования перехода на новый идентификатор ASP.NET заключается в том, что они не используют один и тот же хэш пароля, что исключает перемещение старых членов в базу данных, используемую идентификатором ASP.NET. Похоже, что ASP.NET Identity сейчас находится в постоянном движении, поэтому, возможно, они придумают решение для этого.


Обновление (16.02.14)

Я ошибочно сообщил, что алгоритм хеширования паролей отличается в SimpleMembership и ASP.NET Identity. Я предположил это на основе визуального осмотра хешированных паролей, предполагая, что это был просто хешированный пароль, который был в полях. После дальнейших исследований я обнаружил, что SimpleMembership использует класс System.Web.Helpers.Crypto для хеширования пароля, а то, что хранится в поле пароля, на самом деле является 256-битным подразделом и солью. С этой информацией я провел несколько тестов, чтобы убедиться, что ASP.NET Identity может проверять пароли, сгенерированные SimpleMembership, и он прошел. Я пытался выяснить, какой хеш-алгоритм использует SimpleMembership, чтобы я мог подключить хэшер паролей в ASP.NET Identity, который позволил бы мне перенести данные с веб-сайта SimpleMembership на сайт, использующий ASP.NET Identity. Оказывается не надо. Я рассказываю о хэше пароля и о том, как перенести данные от SimpleMembership до ASP.NET Identity более подробно в этой статье.

person Kevin Junghans    schedule 09.10.2013
comment
VS 2012, ВебМатрикс 2.0.0.0. Следовал этим инструкциям (и связан с тем же постом в моем вопросе). Ваш пустой проект также включал веб-API? Можете ли вы объяснить исключение безопасности, которое я вижу? - person Sixten Otto; 09.10.2013
comment
Извините, я пропустил ссылку в вашем вопросе, на которую я ссылался. Мне не нужно было следовать этим инструкциям, так как я начал с проекта MVC 5. Когда я завершу свой пустой проект, он будет включать веб-API для тестирования пользовательского атрибута AuthorizeAttribute. Поскольку я не пошел по пути обновления, который вы сделали, все, что я проверил, это то, что WebMatrix может работать с MVC 5 в Visual Studio 2013, так что есть некоторая надежда. Что касается исключения безопасности; Вы уверены, что ваше приложение работает с полным доверием? - person Kevin Junghans; 09.10.2013
comment
Я не: как бы я мог сказать? Насколько я понимаю, это значение по умолчанию, и я ничего не делал для явного изменения каких-либо настроек безопасности. Работал нормально до обновления или без попытки инициализировать SimpleMembership. Просто работает в IIS Express локально из VS. - person Sixten Otto; 09.10.2013
comment
Кажется, есть что-то о необходимости полного доверия к приложениям MVC 5, как указано в пункте 4 в разделе «Обновление файла приложения web.config» статьи, на которую вы ссылаетесь. Ошибка, которую вы видите, может быть вызвана тем, что приложение не работает с полным доверием. Ознакомьтесь с этим QA, чтобы узнать, помогает ли он [stackoverflow.com/questions/1090494/. - person Kevin Junghans; 09.10.2013
comment
Опять же, насколько я понял, это был уровень доверия по умолчанию, поэтому я не уверен, почему это не так. Это похоже на более непосредственно применимый код для ответа на вопрос, не так ли? вопрос, когда у меня будет возможность повторно запустить эксперимент: stackoverflow.com/questions/1064274/ - person Sixten Otto; 10.10.2013
comment
Пожалуйста, посмотрите мой обновленный ответ и посмотрите, сработает ли решение, которое сработало для меня, в вашей ситуации. - person Kevin Junghans; 25.10.2013
comment
Я смог заставить свой тест работать, следуя вашим шагам, и я дам вам ответ. Но не кажется, что необходим сам пакет WebHelpers: нужны только его зависимости. - person Sixten Otto; 28.10.2013
comment
@Kevin Junghans, WebMatrix больше не совместим с MVC 6? - person Don; 09.09.2015

Если вы получаете сообщение об ошибке

Попытка прозрачным для безопасности методом «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
person Anushka    schedule 23.03.2014

В настоящее время мы работаем над документом по миграции для перехода с простого членства на удостоверение ASP.NET. Пожалуйста, следите за обновлениями в течение нескольких недель, пока мы не опубликуем этот документ по миграции. На данный момент вам нужно сопоставить схему Simple Membership с Identity и изменить код приложения, чтобы использовать OWIN для SignIN/SIgnOut.

person pranav rastogi    schedule 10.10.2013
comment
Означает ли это, что хэширование паролей, используемое новой системой идентификации ASP.NET, такое же (или может быть настроено), что и SimpleMembership? В худшем случае мы могли бы написать сценарий изменений базы данных, чтобы переместить существующие данные в новые таблицы и тому подобное. Но если мы не можем продолжать использовать существующие учетные данные, то изменения схемы не имеют значения. - person Sixten Otto; 11.10.2013
comment
Есть прогресс по этому документу? Прошло намного больше пары недель, и единственное руководство по миграции, которое я видел, касалось миграции с SQL Membership, а не с SimpleMembership. - person Pando; 09.02.2014
comment
Мы опубликовали пример перехода от простого членства к удостоверению ASP.NET. aspnet.codeplex.com/SourceControl/latest Посмотрите на папку Identity в исходниках, и вы увидите два образца. Simplemembership MigrationSchemaUpdate показывает, как перенести приложение с помощью простого членства и изменить схему, чтобы она соответствовала удостоверению ASP.NET. SimpleMembershipMigration показывает, как можно подключить существующую схему, созданную с помощью Simple Membership, и использовать функции ASP.NET Identity. - person pranav rastogi; 14.02.2014

Приведенные выше ответы работали только на последних веб-страницах 3.2.3. У меня появилась новая проблема. Текущее исправление для меня заключалось в обновлении до .Net 4.5.3. Я понял это из-за разочарования. Эта проблема затрагивает не только MVC 5, но и основные проекты Webmatrix после обновления до веб-страниц 3.2.3. Я думаю, что это проблема с инфраструктурой, которая будет исправлена ​​​​с новой идентификацией Microsoft. Текущее исправление для меня приведено ниже: Примечание. Используйте мастер страниц свойств в 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.

Шаг 3: [Необязательно] Install-Package Owin

Шаг 4. Измените targetFramework на .Net 4.5.3 в диалоговом окне Страницы свойств.

введите здесь описание изображения

[Необязательно] Ваш 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>
person Ifeanyi Chukwu    schedule 20.04.2015

У меня такая же проблема, но не на моем локальном компьютере, но на живом сайте.

Я удалил следующие строки из веб-конфигурации, и теперь он работает.

<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>
person Fatih Çelik    schedule 27.05.2016