[英]Is ASP.NET MVC 5 incompatible with the WebMatrix SimpleMembershipProvider?
我們有一個基於ASP.NET MVC 4和Web API的現有應用程序。 該網站的管理部分使用簡單成員資格。 我有興趣將應用程序升級到MVC 5 / Web API 2,以利用已添加的一些新功能。 但看起來它們可能不兼容。
具體來說,在將NuGet中的RC包安裝到我的解決方案中的一個項目中並更新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已經引入了(又一個)成員身份和身份解決方案 ,但除非有一種方法可以將其用於現有的簡單成員資格表,或者是我們所有現有用戶數據的無縫遷移路徑,這不是一個真正的選擇為了我們。
我剛剛嘗試了一下我們應用程序當前主干的新結帳。 我正在使用Visual Studio 2012,但是按照MS的說明升級現有項目。 更新到MVC 5 / Web API 2 / EF 6后,該應用程序啟動運行就好了。
要刪除的web.config
中沒有明確的信任要求。 我將此問題的代碼添加到Global.asax.cs
,並報告該應用程序以完全信任的方式運行(在IIS Express中,只是來自VS的F5-ed)。
重新添加相同的調用InitializeDatabaseConnection()
,它開始死亡與完全相同的異常。
從周五的@Kevin's更新中嘗試解決方案,我發現它有效。 我真的很奇怪,添加這個顯然不相關的軟件包可以解決這些安全問題,而且在我從我的解決方案中刪除軟件包之后更加奇怪,並且它繼續工作 。
仔細看看發生了什么,我意識到這就解決了這個行為的原因很簡單: Microsoft.AspNet.WebHelpers
包有兩個依賴項被添加到我的解決方案中: Microsoft.AspNet.WebPages.Data
和Microsoft.AspNet.WebPages.WebData
。 Microsoft已將WebMatrix類移動到新包中。
所以添加了幫助程序包修復了問題,不是因為它正在做的任何事情,而是因為它導致破壞的程序集的更新版本被添加到我的解決方案中。 因此,初始不兼容性的解決方案是在從NuGet更新其他所有內容時安裝這些新包:
Install-Package Microsoft.AspNet.WebPages.WebData
有人建議你 ,你可能還需要手動安裝第二個新包:
Install-Package Microsoft.AspNet.WebPages.Data
這不應該是必要的,因為這個包是第一個的顯式依賴 ,而NuGet應該足夠智能來安裝它們。 但是如果在構建時遇到錯誤 ,或者沒有看到NuGet添加依賴項,它可能對您有所幫助。
WebMatrix與MVC 5兼容。
我所做的是采用一個空的MVC 5項目,並使用SimpleSecurity將WebMatrix SimpleMembershipProvider合並到其中, SimpleSecurity是一個將SimpleMembership與MVC應用程序分離的開源項目。 到目前為止,我能夠創建數據庫,播種,登錄和注銷。 我計划在此參考應用程序中添加其他功能,例如電子郵件確認和各種測試。 當我完成后,我將在SimpleSecurity Project中發布源代碼
如果我不得不猜測,您的問題可能出在升級過程中。 您將MVC 4項目升級到MVC 5的過程是什么? 你有沒有按照這個過程 ? 您使用的是哪個版本的WebMatrix程序集? 您使用的是哪個版本的Visual Studio? 我使用的是WebMatrix和Visual Studio 2013 RC 2.0.0.0版。
更新(10/25/2013)
我繼續我的實驗,將SimpleMembership添加到一個MVC 5項目中,並且沿着它破壞的線路,我得到了與@Sixten Otto相同的結果。 我沒有逐步測試,因為我添加了東西,但我懷疑在安裝Web API程序集時可能會發生這種情況。 創建新的MVC 5項目時,默認情況下不會安裝它們。
我對錯誤做了一些更多的研究,並且遇到了這個題為“ 嘗試通過安全透明方法'WebMatrix.WebData.PreApplicationStartCode.Start()' ”的QA。 這是一個舊的質量保證,最初有人在將MVC 3應用程序升級到MVC 4時遇到了同樣的錯誤。但是最近人們一直在為升級到MVC 5添加答案,其中一個答案對我有用。 我的解決方案是安裝NuGet包Microsoft.AspNet.WebHelpers 。 安裝此包后一切正常。
關於我對遷移到新ASP.NET標識的研究的一個注意事項是,它們不使用相同的密碼哈希,這會阻止將舊成員移動到ASP.NET標識使用的數據庫中。 ASP.NET身份似乎現在處於真正的變化中,所以他們可能會為此提出解決方案。
更新(2014年2月16日)
我錯誤地報告了密碼的哈希算法在SimpleMembership和ASP.NET Identity中是不同的。 我假設這是基於哈希密碼的視覺檢查,假設它只是字段中的哈希密碼。 經過進一步研究后,我發現SimpleMembership使用System.Web.Helpers.Crypto類來散列密碼,密碼字段中存儲的內容實際上是256位子密鑰和salt。 有了這些信息,我運行了一些測試來驗證ASP.NET Identity可以驗證由SimpleMembership生成的密碼,並且它已通過。 我試圖找出SimpleMembership使用的哈希算法,因此我可以插入ASP.NET身份中的密碼哈希,這將允許我將數據從SimpleMembership網站遷移到使用ASP.NET身份的網站。 結果證明沒有必要。 我將在本文中更詳細地討論密碼哈希以及如何將數據從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
我們目前正在開發一個遷移文檔,用於從簡單成員身份遷移到ASP.NET身份。 請繼續關注幾周,直到我們推送此遷移文檔。 現在,您必須將Simple Membership模式映射到Identity並更改應用程序代碼以將OWIN用於SignIN / SIgnOut
上述答案直到最近的網頁3.2.3才有效。 一個新問題出現在我面前。 目前的修復方法是升級到.Net 4.5.3。 我認為這是出於挫敗感。 在升級到網頁3.2.3之后,這個問題不僅影響MVC 5,還影響核心Webmatrix項目。 我認為這是一個框架問題,將通過新的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步:[可選]安裝包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>
我有同樣的問題,不是在我的本地電腦,但現場網站有這個。
我從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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.