68

ASP.NET MVC 4 と Web API で構築された既存のアプリケーションがあります。サイトの管理部分はシンプル メンバーシップを使用します。追加された新機能のいくつかを利用するために、アプリケーションを MVC 5 / Web API 2 にアップグレードすることに興味があります。しかし、互換性がない可能性があるようです。

具体的には、NuGet から RC パッケージを私のソリューションのプロジェクトの 1 つにインストールし、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

私がアップグレードしていないシンプル メンバーシップを使用する同じソリューション内の他のプロジェクトは、引き続き正常に動作します。

もちろん、より多くの情報をグーグルで検索すると、その例外について多くのヒットが表示されますが、WebMatrix に固有のものは何もありません。

FWIW: Microsoft が(さらに別の) メンバーシップと ID ソリューションを導入したことは知っていますが、既存の単純なメンバーシップ テーブルでそれを使用する方法、または既存のすべてのユーザー データのシームレスな移行パスがない限り、それは実際にはオプションではありません。私たちのために。

更新 (10 月 11 日)

アプリの現在のトランクを新たにチェックアウトして、これをもう一度試しました。私は Visual Studio 2012 を使用していますが、既存のプロジェクトをアップグレードするための MS の指示に従いました。MVC 5 / Web API 2 / EF 6 に更新した後、アプリは正常に起動して実行されました。

web.config削除するための明示的な信頼要件はありませんでした。この質問のコードを に追加したところGlobal.asax.cs、アプリが完全な信頼で実行されていることが報告されました (IIS Express では、VS から F5 キーを押しただけです)。

に同じ呼び出しを再度追加するInitializeDatabaseConnection()と、まったく同じ例外で停止し始めます。

ソリューション (10 月 28 日)

金曜日の @Kevin の更新で解決策を試してみたところ、うまくいくことがわかりました。この明らかに無関係なパッケージを追加することでこれらのセキュリティの問題が解決されることは本当に奇妙で、ソリューションからパッケージを削除した後もさらに奇妙でした.

何が起こっているのかを詳しく見てみると、これが動作を修正する理由は非常に単純であることがわかりました。Microsoft.AspNet.WebHelpersパッケージには、私のソリューションに追加された 2 つの依存関係がMicrosoft.AspNet.WebPages.DataありMicrosoft.AspNet.WebPages.WebDataます。Microsoft は、WebMatrix クラスを新しいパッケージに移動しました。

そのため、ヘルパーパッケージを追加すると問題が修正されました。これは、それが行っていたことが原因ではなく、壊れたアセンブリの更新されたバージョンが私のソリューションに追加されたためです。したがって、最初の非互換性に対する解決策は、NuGet から他のすべてを更新するときに、これらの新しいパッケージをインストールすることです。

Install-Package Microsoft.AspNet.WebPages.WebData

更新 (2015 年 5 月 13 日)

2 番目の新しいパッケージも手動でインストールする必要があるかもしれないと提案されました。

Install-Package Microsoft.AspNet.WebPages.Data

このパッケージは最初のパッケージの明示的な依存関係であり、NuGet は両方をインストールするのに十分スマートであるため、これは必要ありません。ただし、ビルド時にエラーが発生した場合、または NuGet が依存関係を追加していない場合は、役立つ可能性があります。

4

5 に答える 5

36

WebMatrix は MVC 5 と互換性があります。

私が行ったことは、空の MVC 5 プロジェクトを取得し、MVC アプリケーションから SimpleMembership を分離するオープン ソース プロジェクトであるSimpleSecurityを使用して WebMatrix SimpleMembershipProvider をプロジェクトに組み込むことでした。これまでのところ、データベースを作成してシードし、ログインおよびログアウトすることができます。このリファレンス アプリケーションに、メールの確認や各種テストなど、他の機能を追加する予定です。完了したら、SimpleSecurity プロジェクトにソース コードを投稿します。

推測するに、問題はアップグレード プロセスにある可能性があります。MVC 4 プロジェクトを MVC 5 にアップグレードするためにどのようなプロセスを実行しましたか? このプロセスに従いましたか?使用している WebMatrix アセンブリのバージョンは何ですか? 使用している Visual Studio のバージョンは何ですか? WebMatrix と Visual Studio 2013 RC のバージョン 2.0.0.0 を使用しています。


更新 (2013 年 10 月 25 日)

SimpleMembership を MVC 5 プロジェクトに追加して実験を続けたところ、どこかで壊れて、@Sixten Otto と同じ結果が得られました。追加したときに段階的にテストしませんでしたが、Web API アセンブリをインストールしたときに発生した可能性があるのではないかと疑っています。新しい MVC 5 プロジェクトを作成するとき、これらはデフォルトではインストールされません。

このエラーについてさらに調査を行ったところ、「セキュリティの透過的なメソッド 'WebMatrix.WebData.PreApplicationStartCode.Start()' による試行」というタイトルのこの QA に出会いました。これは古い QA であり、もともと MVC 3 アプリを MVC 4 にアップグレードするときに同じエラーが発生していました。 私にとっての解決策は、NuGet パッケージMicrosoft.AspNet.WebHelpersをインストールすることでした。 このパッケージをインストールした後、すべてが正常に機能しました。

新しい ASP.NET Identity への移行に関する私の調査に関するメモは、同じパスワード ハッシュを使用していないことです。これにより、ASP.NET Identity で使用されるデータベースに古いメンバーを移動することができなくなります。ASP.NET Identity は現在非常に流動的であるように思われるため、おそらく解決策が見つかるでしょう。


更新 (2014 年 2 月 16 日)

パスワードのハッシュ アルゴリズムが SimpleMembership と ASP.NET Identity で異なると誤って報告しました。これは、ハッシュ化されたパスワードの目視検査に基づいており、フィールドにあるのはハッシュ化されたパスワードだけであると想定しました。さらに調査した結果、SimpleMembership は System.Web.Helpers.Crypto クラスを使用してパスワードをハッシュし、パスワード フィールドに格納されているのは実際には 256 ビットのサブキーとソルトであることがわかりました。その情報を使用していくつかのテストを実行し、SimpleMembership によって生成されたパスワードを ASP.NET Identity で検証できることを検証し、合格しました。SimpleMembership が使用するハッシュ アルゴリズムを見つけようとしていたので、ASP.NET Identity にパスワード ハッシャーをプラグインして、SimpleMembership Web サイトから ASP.NET Identity を使用する Web サイトにデータを移行できるようにしました。この記事では、パスワード ハッシュと、SimpleMembership から ASP.NET Identity にデータを移行する方法について詳しく説明します

于 2013-10-09T12:46:15.277 に答える
3

現在、Simple Membership から ASP.NET Identity への移行に関する移行ドキュメントの作成に取り組んでいます。この移行ドキュメントをプッシュするまで、数週間お待ちください。現時点では、Simple Membership スキーマを Identity にマップし、アプリケーション コードを変更して、SignIN/SIgnOut に OWIN を使用する必要があります。

于 2013-10-10T17:59:41.077 に答える
3

上記の回答は、最近の Web ページ 3.2.3 まで機能しませんでした。新しい問題が私に現れました。私にとっての現在の修正は、.Net 4.5.3 にアップグレードすることでした。私は欲求不満からこれを考え出しました。この問題は、MVC 5 だけでなく、Web ページ 3.2.3 にアップグレードした後のコア Webmatrix プロジェクトにも影響します。新しい 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

ステップ 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>
于 2015-04-20T10:56:24.367 に答える
1

ローカルコンピューターではなく、ライブサイトで同じ問題が発生しました。

以下の行を Web 構成から削除しましたが、現在は機能しています。

<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>
于 2016-05-27T15:08:59.417 に答える