ASP.NET MVC 5与WebMatrix SimpleMembershipProvider不兼容吗?

我们有一个基于ASP.NET MVC 4和Web API的现有应用程序。 该网站的pipe理员部分使用简单成员资格。 我有兴趣将应用程序升级到MVC 5 / Web API 2,以利用已经添加的一些新function。 但看起来他们可能不兼容。

具体来说,在将NuGet中的RC包安装到我的解决scheme中的一个项目中并更新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 

在同样的解决scheme中使用简单的成员,我还没有升级的其他项目继续工作就好了。

谷歌search更多的信息,当然,这个例外,很多点击,但没有什么特别的WebMatrix。

FWIW:我知道微软已经引入了(又一个)成员资格和身份authentication解决scheme ,但除非现有的简单成员资格表或者我们现有用户数据的无缝迁移path,否则这不是一个真正的select为了我们。

更新(10月11日)

我刚刚尝试了这个新的结算我们的应用程序的当前主干。 我正在使用Visual Studio 2012,但是按照MS的说明升级现有项目。 更新到MVC 5 / Web API 2 / EF 6后,应用程序启动运行就好了。

web.config中没有明确的信任要求来删除。 我将这个问题的代码添加到了Global.asax.cs ,并且报告应用程序正在以完全信任的方式运行(在IIS Express中,只是从VS的F5版本开始)。

重新添加相同的调用InitializeDatabaseConnection() ,它开始死于完全相同的exception。

解决scheme(10月28日)

从星期五开始在@凯文的更新中尝试解决scheme,我发现它的工作原理。 我真的很奇怪,添加这个明显不相关的软件包可以解决这些安全问题,而且在我从我的解决scheme中删除软件包之后,这个软件还能继续工作

仔细看看发生了什么,我意识到这个问题解决这个问题的原因很简单: Microsoft.AspNet.WebHelpers软件包有两个依赖项被添加到我的解决scheme中: Microsoft.AspNet.WebPages.DataMicrosoft.AspNet.WebPages.WebData微软已经将WebMatrix类移入新的包中。

所以添加helpers包修复了这个问题,不是因为它做的任何事情,而是因为它导致破坏的程序集的更新版本被添加到我的解决scheme中。 那么解决最初的不兼容问题就是在从NuGet更新其他东西时安装这些新的软件包:

 Install-Package Microsoft.AspNet.WebPages.WebData 

更新(2015年5月13日)

有人build议我可能还需要手动安装第二个新软件包:

 Install-Package Microsoft.AspNet.WebPages.Data 

不应该是必要的,因为这个包是第一个显式的依赖 ,并且NuGet应该足够聪明来安装两者。 但是如果你在构build时遇到错误 ,或者没有看到NuGet添加依赖项,它可能会帮助你。

WebMatrix与MVC 5兼容。

我所做的是采用一个空的MVC 5项目,并使用SimpleSecurity将WebMatrix SimpleMembershipProvider合并到它中, SimpleSecurity是一个将SimpleMembership与MVC应用程序分离的开源项目。 到目前为止,我能够创build数据库,种子,login和注销。 我计划在此参考应用程序中添加其他function,例如电子邮件确认和各种testing。 完成后,我将在SimpleSecurity项目中发布源代码

如果我不得不猜测,您的问题可能与升级过程。 你把你的MVC 4项目升级到MVC 5的过程是什么? 你有没有遵循这个过程 ? 你使用什么版本的WebMatrix组件? 你使用的是什么版本的Visual Studio? 我正在使用WebMatrix和Visual Studio 2013 RC版本2.0.0.0。


更新(10/25/2013)

我继续我的实验,将SimpleMembership添加到一个MVC 5项目,并沿着它打破的线路,我得到了与@Sixten Otto相同的结果。 我没有增加testing,因为我添加了一些东西,但是当我安装Web API程序集时,可能发生了这种情况。 在创build新的MVC 5项目时,它们不是默认安装的。

我做了一些关于错误的更多的研究,并且遇到了这个题为“ 通过安全透明方法尝试WebMatrix.WebData.PreApplicationStartCode.Start()' ”的QA。 这是一个旧的QA,最初有人在将MVC 3应用程序升级到MVC 4时遇到了同样的错误。但是最近人们已经添加了关于升级到MVC 5的答案,其中一个答案适用于我。 我的解决scheme是安装NuGet包Microsoft.AspNet.WebHelpers 安装这个包后,一切正常。

关于迁移到新的ASP.NET标识的研究的一个注意事项是他们不使用相同的密码散列,这排除了将旧的成员移动到ASP.NET身份使用的数据库。 ASP.NET身份似乎现在正在stream行,所以也许他们会为此提出一个解决scheme。


更新(2/16/14)

我错误地报告说,SimpleMembership和ASP.NET Identity中密码的散列algorithm是不同的。 我假定这是基于哈希密码的视觉检查,假设它只是在字段中的哈希密码。 经过进一步研究,我发现SimpleMembership使用System.Web.Helpers.Crypto类来对密码进行散列,密码字段中存储的是256位的子密钥和salt。 有了这些信息,我运行了一些testing来validationASP.NET身份validation可以validation由SimpleMembership生成的密码,并通过了。 我试图找出使用什么散列algorithmSimpleMembership,所以我可以在ASP.NET身份插入一个密码散列器,这将允许我将数据从一个SimpleMembership网站迁移到一个使用ASP.NET身份。 原来,这是没有必要的。 我将在本文中详细讨论密码散列以及如何将数据从SimpleMembership迁移到ASP.NET Identity 。

如果你得到错误

尝试通过安全透明方法“WebMatrix.WebData.PreApplicationStartCode.Start()”访问安全关键方法“System.Web.WebPages.Razor.WebPageRazorHost.AddGlobalImport(System.String)”失败。

为了解决这个安装这个包使用NuGet包pipe理器。

 Install-Package Microsoft.AspNet.WebHelpers 

之后,可能你会得到另一个错误

无法加载WebMatrix.Data版本3.0.0.0程序集

修复这个安装这个包使用NuGet包pipe理器。

 Install-Package Microsoft.AspNet.WebPages.Data 

我们目前正在开发一个迁移文档,用于从Simple Membership迁移到ASP.NET Identity。 请等待几个星期,直到我们推送这个移民文件。 现在,您必须将您的简单成员身份架构映射到身份,并将您的应用程序代码更改为使用OWIN for SignIN / SIgnOut

上述答案直到最近的网页3.2.3才起作用。 一个新的问题出现在我身上。 目前的修补程序是通过升级到.Net 4.5.3。 我从挫折中想到了这一点。 这个问题不仅影响MVC 5,而且在升级到网页3.2.3之后也是核心的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> 

我遇到了同样的问题,而不是在我的本地计算机,但现场是有这个。

我从networkingconfiguration中删除下面的行,现在正在工作。

 <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>