System.Web 可以与具有完整框架的 ASP.Net Core 一起使用吗

Posted

技术标签:

【中文标题】System.Web 可以与具有完整框架的 ASP.Net Core 一起使用吗【英文标题】:Can System.Web be used with ASP.Net Core with Full Framework 【发布时间】:2017-04-16 04:47:00 【问题描述】:

我们正在运行基于不同 .Net 版本的多个站点。

其中一个站点正在运行 .Net 4.6 和 ASP.Net MVC 5.xx

要使用 Razor 的新语法,我们希望将此站点升级为使用 .Net 4.6 和 ASP.Net Core

我们在我们的网站上使用 FormsAuthentication,我们将继续使用它,以便用户可以在网站之间移动。 (其中一个网站是运行 FormsAuthentication 的 SharePoint 网站)

我们知道 ASP.Net Core 没有使用 System.Web 中的任何东西,但我们需要使用控制器(在登录期间创建 FormsAuthentication cookie)和 HttpModule 来验证 cookie。

我无法从运行 ASP.Net Core 且具有完整框架的站点中找到如何使用 system.web 的任何示例。我无法在 project.json 中为 system.web 添加依赖项。

问题。

    是否可以通过这样的设置使用 system.web?

    我们如何添加对 system.web 的依赖,以便 System.Web.FormsAuthentication 可从 ASP.NET MVC 6 获得。(控制器/http 模块)

【问题讨论】:

为什么不在 .Net core 中进行表单身份验证? .Net Core 不支持表单身份验证。这是我们无法迁移到 .Net Core 的原因之一,因为我们正在使用 FormsAuthentication 运行所有其他站点。 (目前还有其他与.Net core不兼容的依赖) 使用 System.Web dll 与使用 System.Web 不同。 System.Web 管道不会为您的 ASP.NET Core 应用程序运行,因此您无法做您想做的事情。 应该可以使 FormsAuthentication 与 Asp.Net Core 一起工作,示例请参见此处:***.com/questions/44018218/… 【参考方案1】:

使用 System.Web dll 与使用 System.Web 不同。 System.Web 管道不会为您的 ASP.NET Core 应用程序运行,因此您无法执行您正在尝试执行的操作。

【讨论】:

谢谢大卫。那是我害怕的。我需要开始研究如何将 SharePoint 中的表单身份验证替换为兼容的选项。 System.Web 的许多相似之处都在 Microsoft.AspNetCore 中。 我们可以添加 Microsoft.AspNetCore 而不是 System.Web 吗?【参考方案2】:

这可能不像你想的那样奏效。当您针对完整框架使用 .Net Core MVC 时,确实存在 System.Web 命名空间并且在技术上可以被调用,但它不会像您想要的那样工作。原因是 Asp.Net Core 和 System.Web 的请求管道完全不同。因此,例如,当使用 Asp.Net Core MVC 时,如果您从请求进入时检查 HttpContext 对象,它将填充您期望的所有信息,但如果您使用 System.Web 对象检查当前请求,您将看到它们的当前没有请求。那是因为当前请求不是通过 System.Web 管道进入的。如果您愿意,它是通过 .Net Core“管道”进入的。因此,如果您使用 .Net Core MVC,您将需要坚持使用该框架的工具和方法,而不是 System.Web 中提供的工具和方法。

但是,如果您真的想要,应该可以引用 System.Web.dll。如果您使用的是 VS2015,则需要获取 System.Web.Dll 的副本并将其包装在 nuget 包中以建立对其的引用。请参阅此处.net core 1.0 visual studio referencing external dll VS2017RC 具有 alpha 工具,可以消除将其包装在 NuGet 包中的需要,但我在我的机器上安装它时遇到了问题,因此我无法亲自担保。 更新: VS2017 现在为 Asp.Net Core 提供了很好的工具并引用了完整的框架 Dll。

【讨论】:

我们明确将 Cookie 发送到 FormsAuthentication,因此这不是真正的问题。 (如果不是 FormsAuthenticaiton 里面期望来自请求的东西)来自 HttpModule 的示例验证 cookie FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value) 我听到了,如果您可以在 4.x 的 FormsAuthentication API 中使用足够低的原始方法,这些方法不访问 HttpContext 或 any 它的子对象,那么你也许可以让它工作。但这是一个很大的假设,而且大多数人都不想在生产中支持。 我们至少想试试看是否可行。我真的很喜欢新的干净的 Razor 语法。 (我们正在使用 .Net 核心构建其他不相关的站点)但首先我们需要一种方法来为 system.web 创建一个依赖关系,该依赖关系可以从运行完整框架的应用程序访问。如果即使这也不可能,它也是 FormsAuthentication 的一个亮点,那么我们可能需要考虑将其他站点的身份验证更改为可以跨平台使用的新东西。 @TheTechArch 您是否有机会分享任何信息、提示、参考资料,以及您想出的在网络表单和 razor pages/.net 核心站点之间“共享”身份验证的任何内容?跨度> @MargoNoreen 我们最终创建了一个自定义机制,其中 asp.net 核心应用程序调用旧平台来解密 aspxauth 并将其转换为 JWT。

以上是关于System.Web 可以与具有完整框架的 ASP.Net Core 一起使用吗的主要内容,如果未能解决你的问题,请参考以下文章

面向具有 EF6 和 Identity 的完整框架的 ASP.NET Core

具有高度的 ASP.NET 模拟

浅析Asp.net MVC 中Ajax的使用

asp.net ajax客户端框架如何调用Web Service

asp.net 使用了框架 web.config 如何设置 session

自己动手写一个简单的MVC框架(第二版)