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


68

我们有一个基于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:我知道微软已经(另外)引入了成员资格和身份解决方案,但是除非有一种方法可以将其与现有的“简单成员资格”表结合使用,或者为我们所有现有的用户数据提供无缝迁移路径,否则这不是一个选择为我们。

更新(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程序包有两个依赖项已添加到我的解决方案中:Microsoft.AspNet.WebPages.DataMicrosoft.AspNet.WebPages.WebDataMicrosoft已将WebMatrix类移动到新程序包中。

因此添加了helpers包来解决问题,不是因为它在做什么,而是因为它导致损坏的程序集的更新版本被添加到我的解决方案中。最初不兼容的解决方案是在更新NuGet的其他所有内容时安装这些新软件包:

Install-Package Microsoft.AspNet.WebPages.WebData

更新(2015年5月13日)

已向我建议您可能还需要手动安装第二个新软件包:

Install-Package Microsoft.AspNet.WebPages.Data

不是必需的,因为此软件包是第一个软件包的显式依赖项,并且NuGet应该足够聪明以安装这两个软件包。但是,如果在构建时遇到错误,或者看不到NuGet添加依赖项,则可能会对您有所帮助。


6
我希望我可以多次投票,谢谢,谢谢,感谢您渡过麻烦来记录您的过程。我正要进入紧急模式。在今天早上的演讲中,您免于我感到尴尬。
约瑟夫·怀特

我还必须从项目引用中实际删除webmatrix。这些软件包的卸载和webhelpers的安装对我来说没有作用。
Beth Whitezel

非常感谢。Install-Package Microsoft.AspNet.WebPages.WebData适用于我
ARC

Answers:


36

WebMatrix与MVC 5兼容。

我要做的是拿一个空的MVC 5项目,并使用SimpleSecurity将WebMatrix SimpleMembershipProvider合并到其中,该项目是一个将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()' ”进行的质量检查。这是一个古老的质量检查程序,最初是将MVC 3应用程序升级到MVC 4时遇到的相同错误。但是最近人们一直在添加有关升级到MVC 5的答案,其中一个答案对我有用。 对我来说,解决方案是安装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


VS 2012,WebMatrix 2.0.0.0。确实遵循了这些指示(并链接到我的问题中的同一帖子)。您的空白项目是否还包含Web API?您能解释我看到的安全异常吗?
Sixten Otto 2013年

抱歉,我错过了您问题中的链接,该链接与我引用的链接相同。自从开始MVC 5项目以来,我不需要遵循这些说明。当我完成我的空项目时,它将包含Web API以测试自定义AuthorizeAttribute。由于我没有采用您所做的升级路径,因此我已验证的是WebMatrix可以在Visual Studio 2013中与MVC 5配合使用,因此存在一些希望。至于安全例外;您确定您的应用程序在完全信任的情况下运行吗?
凯文·荣汉斯

我不是:我该如何分辨?我的理解是这是默认设置,并且我没有做任何事情来明确更改任何安全设置。在升级之前,或者不尝试初始化SimpleMembership时都可以正常运行。只是从VS在IIS Express中本地运行。
Sixten Otto 2013年

如您所引用的文章的“更新应用程序web.config文件”部分中的第4项所述,似乎需要完全信任MVC 5应用程序。您看到的错误可能是由于应用程序未完全信任运行所致。查看此质量检查以查看是否有帮助[ stackoverflow.com/questions/1090494/…
凯文·荣汉斯

同样,根据我的理解,这是默认的信任级别,因此我不确定为什么不是这样。看起来更直接适用的代码可以回答“是吗?” 问题,当我得到机会重新运行实验:stackoverflow.com/questions/1064274/...
Sixten奥托

30

如果出现错误

尝试通过安全透明方法'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

3

我们目前正在研究一个迁移文档,用于从简单成员身份迁移到ASP.NET Identity。请继续关注几周,直到我们推送此迁移文档。现在,您必须将您的简单成员资格架构映射到身份,并更改您的应用程序代码以将OWIN用于SignIN / SIgnOut


这是否意味着新的ASP.NET Identity系统使用的密码哈希与(或可以配置为)与SimpleMembership所做的相同?最糟糕的是,我们可以编写数据库更改脚本以将现有数据移动到新表等中。但是,如果我们不能继续使用现有的凭据,则架构更改是不相关的。
Sixten Otto

有关从较早的SQL成员资格进行迁移教程已结束。看起来,解决方案似乎是提供了一个自定义哈希服务,该服务从字面上复制粘贴了来自较旧提供程序的代码,并根据数据库中哈希密码字符串的格式使用该代码或默认的Identity实现。我们是否应该假设简单会员资格的解决方案是相同的?(猜想WebMatrix源代码是公开的,这是一件好事,是吧?)
Sixten Otto

这个文件有什么进展吗?它已经远远超过了“几周”,而且我看到的唯一迁移指南是从SQL成员身份迁移的指南,而不是从SimpleMembership迁移的指南。
Pando 2014年

我们已经发布了有关如何从简单成员身份迁移到ASP.NET Identity的示例。aspnet.codeplex.com/SourceControl/latest查看源代码中的Identity文件夹,您将看到两个示例。Simplemembership MigrationSchemaUpdate向您展示了如何使用简单成员资格迁移应用程序以及如何更改架构以匹配ASP.NET Identity。SimpleMembershipMigration显示如何插入使用“简单成员资格”创建的现有架构并使用ASP.NET身份功能。
pranav rastogi 2014年

3

直到最近的网页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>

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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.