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

Posted

技术标签:

【中文标题】ASP.NET MVC 5 是不是与 WebMatrix SimpleMembershipProvider 不兼容?【英文标题】:Is ASP.NET MVC 5 incompatible with the WebMatrix SimpleMembershipProvider?ASP.NET MVC 5 是否与 WebMatrix SimpleMembershipProvider 不兼容? 【发布时间】:2013-10-10 18:43:42 【问题描述】:

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

具体来说,在将来自 NuGet 的 RC 包安装到我的解决方案中的一个项目和updating the web.config information 之后,应用程序在启动期间在调用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:我知道微软已经引入了(yet another) membership and identity solution,但除非有一种方法可以将其与现有的简单成员表一起使用,或者我们所有现有用户数据的无缝迁移路径,否则这对我们来说并不是一个真正的选择.

更新(10 月 11 日)

我刚刚再次尝试重新检查我们应用程序的当前主干。我正在使用 Visual Studio 2012,但另外按照 MS 的说明升级现有项目。更新到 MVC 5 / Web API 2 / EF 6 后,应用程序启动运行正常。

web.config 中没有要删除的明确信任要求。我将this question 中的代码添加到Global.asax.cs,它报告应用程序正在以完全信任的方式运行(在 IIS Express 中,仅来自 VS 的 F5)。

将相同的调用重新添加到InitializeDatabaseConnection(),它开始因完全相同的异常而死亡。

解决方案(10 月 28 日)

从周五开始尝试@Kevin 更新中的解决方案,我发现它有效。对我来说真的很奇怪,添加这个明显不相关的包会解决这些安全问题,甚至在我从解决方案中删除包之后奇怪,它继续工作

仔细查看发生的情况,我意识到修复此行为的原因非常简单:Microsoft.AspNet.WebHelpers 包有两个依赖项已添加到我的解决方案中:Microsoft.AspNet.WebPages.DataMicrosoft.AspNet.WebPages.WebDataMicrosoft 已将 WebMatrix 类移至新包中。

所以添加了帮助程序包来解决问题,不是因为它正在做任何事情,而是因为它导致将损坏的程序集的更新版本添加到我的解决方案中。因此,最初不兼容的解决方案是在从 NuGet 更新其他所有内容时安装这些新包:

Install-Package Microsoft.AspNet.WebPages.WebData

更新(2015 年 5 月 13 日)

已经suggested to me你可能还需要手动安装第二个新包:

Install-Package Microsoft.AspNet.WebPages.Data

这个不应该是必要的,因为这个包是an explicit dependency 的第一个包,NuGet 应该足够聪明,可以同时安装这两个包。但是,如果您收到 an error when building,或者没有看到 NuGet 添加依赖项,它可能会对您有所帮助。

【问题讨论】:

我希望我能多次投票,谢谢,谢谢,谢谢你不厌其烦地记录你的过程。我正要进入恐慌模式。你让我免于在今天早上的演讲中感到尴尬。 我还必须从我的项目引用中实际删除 webmatrix。卸载这些包并安装 webhelpers 并没有为我做那部分。 非常感谢。安装包 Microsoft.AspNet.WebPages.WebData 对我有用 【参考方案1】:

WebMatrix 与 MVC 5 兼容。

我所做的是采用一个空的 MVC 5 项目并使用 SimpleSecurity 将 WebMatrix SimpleMembershipProvider 合并到其中,这是一个 decouples SimpleMembership from your MVC application 的开源项目。到目前为止,我能够创建数据库、播种并登录和注销。我计划在此参考应用程序中添加其他功能,例如电子邮件确认和各种测试。完成后我会将源代码发布到SimpleSecurity Project

如果我不得不猜测,您的问题可能与升级过程有关。您采用什么过程将 MVC 4 项目升级到 MVC 5? Did you follow this process?您使用的是什么版本的 WebMatrix 程序集?您使用的是什么版本的 Visual Studio?我正在使用 2.0.0.0 版的 WebMatrix 和 Visual Studio 2013 RC。


更新(2013 年 10 月 25 日)

我继续我的实验,将 SimpleMembership 添加到 MVC 5 项目中,并且在某个地方它中断了,我得到了与 @Sixten Otto 相同的结果。我没有在添加内容时进行增量测试,但我怀疑它可能是在我安装 Web API 程序集时发生的。创建新的 MVC 5 项目时默认不安装它们。

我对该错误进行了更多研究,并遇到了这个标题为“Attempt by security transparent method 'WebMatrix.WebData.PreApplicationStartCode.Start()'”的 QA。这是一个旧的 QA,最初有人在将 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 网站迁移到使用 ASP.NET Identity 的网站。事实证明这是没有必要的。 I talk about the password hash and how to migrate the data from SimpleMembership to ASP.NET Identity in more detail in this article.

【讨论】:

VS 2012,WebMatrix 2.0.0.0。是否遵循了这些说明(并链接到我的问题中的同一篇文章)。您的空项目是否也包含 Web API?你能解释我看到的安全异常吗? 对不起,我错过了您问题中的链接,该链接与我引用的链接相同。自从我开始使用 MVC 5 项目以来,我不需要遵循这些说明。当我完成我的空项目时,它将包含用于测试自定义 AuthorizeAttribute 的 Web API。由于我没有采取你所做的升级路径,我所验证的只是 WebMatrix 可以在 Visual Studio 2013 中与 MVC 5 一起使用,所以有一些希望。至于安全例外;您确定您的应用程序在完全信任的情况下运行吗? 我不是:我怎么知道?我的理解是这是默认设置,我没有做任何事情来明确更改任何安全设置。在升级之前运行良好,或者没有尝试初始化 SimpleMembership。只需在 VS 本地运行 IIS Express。 似乎需要完全信任 MVC 5 应用程序,如您引用的文章的“更新应用程序 web.config 文件”部分中的第 4 项所述。您看到的错误可能是由未完全信任运行的应用程序引起的。看看这个 QA 看看它是否有帮助 [***.com/questions/1090494/…. 再说一次,我的理解是这是默认的信任级别,所以我不确定为什么不这样。这看起来像更直接适用的代码来回答“是吗?”当我有机会重新运行实验时的问题:***.com/questions/1064274/…【参考方案2】:

如果遇到错误

尝试通过安全透明的方法 '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 身份。请继续关注几周,直到我们推送此迁移文档。 现在,您必须将您的简单成员模式映射到身份,并更改您的应用程序代码以使用 OWIN 进行登录/登录

【讨论】:

这是否意味着新的 ASP.NET 身份系统使用的密码散列与 SimpleMembership 使用的(或可以配置为)相同?最糟糕的是,我们可以编写数据库更改脚本以将现有数据移动到新表等。但是如果我们不能继续使用现有的凭据,那么架构更改就无关紧要了。 tutorial on migrating from the older SQL Membership 已启动。看起来解决方案是提供一个自定义散列服务,从字面上复制粘贴旧提供程序的代码,并使用该或默认身份实现,具体取决于数据库中散列密码字符串的格式。我们是否应该假设简单成员的解决方案是相同的? (猜猜WebMatrix源代码公开是件好事吧?) 这份文件有什么进展吗?这已经远远超过“几个星期”了,我看到的唯一迁移指南是从 SQL Membership 迁移 - 而不是 SimpleMembership。 我们发布了一个关于如何从简单成员身份迁移到 ASP.NET 身份的示例。 aspnet.codeplex.com/SourceControl/latest 查看源代码中的 Identity 文件夹,您将看到两个示例。 Simplemembership MigrationSchemaUpdate 向您展示了如何使用简单的成员身份迁移应用程序并更改架构以匹配 ASP.NET 标识。 SimpleMembershipMigration 展示了如何插入使用 Simple Membership 创建的现有架构并使用 ASP.NET Identity 功能。【参考方案4】:

上述答案直到最近的网页 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 步:[可选] 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>

【讨论】:

【参考方案5】:

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

我从网络配置中删除了下面的行,它现在可以工作了。

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

【讨论】:

以上是关于ASP.NET MVC 5 是不是与 WebMatrix SimpleMembershipProvider 不兼容?的主要内容,如果未能解决你的问题,请参考以下文章

我们是不是正在使用 .Net 3.5 中的 MVC 框架转向经典 ASP?

ASP.Net MVC 5 身份验证与另一个 MVC 5 身份网站

解读ASP.NET 5 & MVC6系列:核心技术与环境配置

Angular 路由模板 url 是不是支持 ASP.Net MVC 5 项目中的 *.cshtml 文件?

Microsoft 'Identity Platform' 是不是(轻松)与'(ASP.NET) Identity Framework' - MVC5 & .NET 4.7.2 集成?

ASP.NET MVC 4(测试版)中 HTML-5 data-* 属性的使用是不是中断?