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
_
私がnotアップグレードしたSimple Membershipを使用した同じソリューション内の他のプロジェクトは、引き続き正常に動作します。
情報を求めてグーグルで検索すると、もちろんその例外に対して多くのヒットが見つかりますが、WebMatrixに特化したものはありません。
FWIW:Microsoftが (別の)メンバーシップおよびIDソリューション を導入したことは知っていますが、既存のSimple Membershipテーブルでそれを使用する方法、または既存のすべてのユーザーのシームレスな移行パスがない限りデータ、それは私たちにとって本当にオプションではありません。
アプリの現在のトランクを新たにチェックアウトして、これを再試行しました。 Visual Studio 2012を使用していますが、それ以外の場合は、MSの指示に従って既存のプロジェクトをアップグレードします。 MVC 5/Web API 2/EF 6に更新した後、アプリは問題なく起動しました。
_web.config
_に削除する明示的な信頼要件はありませんでした。 この質問 から_Global.asax.cs
_にコードを追加し、アプリが完全な信頼で実行されていることを報告します(IIS Express、F5-ed VSから)。
同じ呼び出しをInitializeDatabaseConnection()
に再度追加すると、まったく同じ例外で死に始めます。
金曜日から@Kevinのアップデートで解決策を試してみたところ、うまくいくことがわかりました。この明らかに無関係なパッケージを追加することでこれらのセキュリティの問題が解決することは本当に奇妙でした。また、ソリューションからパッケージを削除した後moreでさえ奇妙です作業を続けた。
何が起こっているのかを詳しく見ると、これが動作を修正する理由は非常に簡単であることがわかりました:_Microsoft.AspNet.WebHelpers
_パッケージには、私のソリューションに追加された2つの依存関係があります:_Microsoft.AspNet.WebPages.Data
_および_Microsoft.AspNet.WebPages.WebData
_。 MicrosoftはWebMatrixクラスを新しいパッケージに移動しました。
ヘルパーパッケージを追加すると、問題が修正されましたが、それが原因ではなく、が原因で破損したアセンブリの更新バージョンが追加されたためです私の解決策。最初の非互換性の解決策は、他のすべてをNuGetから更新するときにこれらの新しいパッケージをインストールすることです。
_Install-Package Microsoft.AspNet.WebPages.WebData
_
推奨 2番目の新しいパッケージを手動でインストールする必要がある場合もあります。
_Install-Package Microsoft.AspNet.WebPages.Data
_
このパッケージは最初の 明示的な依存関係 であり、NuGetは両方をインストールするのに十分スマートであるため、このは必要ありません。しかし、 ビルド時のエラー が発生する場合、またはNuGetが依存関係を追加するのを確認できない場合は、役立つかもしれません。
WebMatrixはMVC 5と互換性があります。
空のMVC 5プロジェクトを取得し、WebMatrix SimpleMembershipProviderを SimpleSecurity 、 MVCアプリケーションからSimpleMembershipを分離 するオープンソースプロジェクトを使用して組み込みました。これまでのところ、データベースを作成し、シードし、ログインおよびログアウトすることができます。電子メールの確認やさまざまなテストなど、このリファレンスアプリケーションに他の機能を追加する予定です。完了したら、ソースコードを SimpleSecurity Project に投稿します
推測する必要がある場合、問題はアップグレードプロセスにある可能性があります。 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にアップグレードするときに元々このエラーが発生していましたが、最近、MVC 5へのアップグレードに関して回答が追加されており、回答の1つが役に立ちました。 私にとっての解決策は、NuGetパッケージをインストールすることでしたMicrosoft.AspNet.WebHelpers。このパッケージをすべてインストールした後、うまくいきました。
新しいASP.NET Identityへの移行に関する私の研究に関する注意点は、同じパスワードハッシュを使用していないため、古いメンバーをASP.NET Identityが使用するデータベースに移動できないことです。 ASP.NET Identityは今まさに流動的であるように思われるので、おそらくその解決策を考え出すでしょう。
更新(2/16/14)
パスワードのハッシュアルゴリズムがSimpleMembershipとASP.NET Identityで異なると誤って報告しました。これは、ハッシュ化されたパスワードの目視検査に基づいて、フィールド内にあるのはハッシュ化されたパスワードだけであると仮定して想定しました。さらに調査した結果、SimpleMembershipはSystem.Web.Helpers.Cryptoクラスを使用してパスワードをハッシュし、パスワードフィールドに格納されているのは実際には256ビットのサブキーとソルトであることがわかりました。その情報を使用して、ASP.NET IdentityがSimpleMembershipによって生成されたパスワードを検証できることを検証するテストをいくつか実行し、合格しました。 SimpleMembershipが使用しているハッシュアルゴリズムを見つけようとしていたため、ASP.NET Identityのパスワードハッシュをプラグインして、SimpleMembership webisteからASP.NET Identityを使用するものにデータを移行できました。必要ではないことが判明しました。 この記事では、パスワードハッシュとSimpleMembershipからASP.NET Identityにデータを移行する方法について詳しく説明します 。
エラーが発生している場合
セキュリティ透過メソッド「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
上記の回答は、最近の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>
現在、Simple MembershipからASP.NET Identityに移行するための移行ドキュメントを作成しています。この移行ドキュメントをプッシュするまで、数週間お待ちください。今のところ、Simple MembershipスキーマをIdentityにマップし、Signin/SIgnOutにOWINを使用するようにアプリケーションコードを変更する必要があります
ローカルコンピューターではなく、同じ問題が発生しましたが、ライブサイトではそれが発生していました。
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>