经典 ASP 和 ASP.NET 集成

Posted

技术标签:

【中文标题】经典 ASP 和 ASP.NET 集成【英文标题】:Classic ASP and ASP.NET Integration 【发布时间】:2008-09-25 12:59:46 【问题描述】:

在之前的工作中,我们有一个经典的 ASP 应用程序,没有人愿意迁移到 ASP.NET。它所做的事情,做得非常好。

但是,需要添加一些似乎最适合 ASP.NET 的新功能。做出决定是为了让系统成为 ASP 和 ASP.NET 的奇怪混合体。

我们最大的症结在于会话管理,我们共同开发了一个通过表单变量传递会话值的解决方案。我已经与其他通过 cookie 处理同样问题的人交谈过。

这两种方法看起来都很糟糕(除了非常不安全之外)。

是否有更好或更清洁的方法,或者这只是一个糟糕的主意,开始讨论该主题毫无意义?

【问题讨论】:

【参考方案1】:

您不能将会话数据保存到服务器端数据存储吗?即 XML 文件、数据库等。然后您可以将哈希(根据一些安全识别会话的标准计算)传递给 .NET 页面,该页面可以使用此标识符从数据存储中提取数据并填充您的会话数据.这仍然意味着每次都必须通过代理将请求从 ASP 传递到 ASP.NET,以确保每个应用程序中都有最新的会话数据,但恐怕我不知道实现此目的的替代方法。

【讨论】:

【参考方案2】:

我不得不处理同样的问题。就我而言,我将密钥加密到 cookie 中,并将数据库用于任何其他信息。我在 .NET 中编写了加密并进行了互操作以解密 ASP 端的 id。处理 base-64 字符串有些奇怪,因为 ASP 不会获得与 .NET 相同的字符串,因此您可能必须像我一样将 base-64 字符串重写为等效的十六进制或一些类似的最低公分母战术。它相对安全(避免 XSS 攻击)。

【讨论】:

Base64 算法非常稳定,ASP 无法原生处理 Base64。因此,您之前使用的任何算法都只是简单的错误。 ASP 中的 Request.Cookies 做了一些 ASP.NET 中没有的编码【参考方案3】:

嗯,最终最好的办法可能是将 ASP 应用程序转换为 .NET。我认为这可能是不言而喻的。如果安全是一个大问题,您可以采取一些措施来加密和维护会话信息的完整性,以使其更加安全,例如一些对称加密和散列等等。

【讨论】:

【参考方案4】:

在一般情况下,我不知道有什么更清洁的方法可以做到这一点。但也许您可以更具体地描述您必须在系统之间共享什么状态?在您的特定情况下可能有更清洁的解决方案。 会话对象状态并不总是保持状态的最佳方式。

【讨论】:

【参考方案5】:

我必须同意Wes P ...长期目标是什么?如果长期目标是将经典的 ASP 应用程序迁移到 ASP.NET,那么我认为我的短期修复,无论它是什么,都会起作用。如果长期要保留经典的 ASP 应用程序,那么最好使用更强大的会话管理解决方案,类似于Oglester 推荐的解决方案。

【讨论】:

【参考方案6】:

您可以创建一个新的 .NET Web 窗体应用程序,在其中包含您的 .asp 经典代码,并将以下内容添加到您的 web.config 文件中。请务必在 Integrated Pipeline 模式下运行应用程序池。

这将确保身份验证模块(如表单身份验证)向后兼容 ASP Classic。您的 ASP Classic 代码将受到您的 .NET 代码所使用的相同身份验证机制的保护(如 web.config 中所定义),而不必像您提到的那样实施自有机制。

  <system.webServer>
    <modules>
      <remove name="FormsAuthenticationModule" />
      <add name="FormsAuthenticationModule" type="System.Web.Security.FormsAuthenticationModule" />
      <remove name="UrlAuthorization" />
      <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" />
      <remove name="DefaultAuthentication" />
      <add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" />
      <remove name="Session" />
      <add name="Session" type="Microsoft.AspNet.SessionState.SessionStateModuleAsync, Microsoft.AspNet.SessionState.SessionStateModule, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode" />
    </modules>
  </system.webServer> 

【讨论】:

值得注意的是,您只能将 ASP Classic 与 WebForms 合并,因此 .NET Core 将不是您构建的选项

以上是关于经典 ASP 和 ASP.NET 集成的主要内容,如果未能解决你的问题,请参考以下文章

win7+iis7.5+asp.net下 CS0016: 未能写入输出文件“c:WindowsMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NE

IIS7 集成与经典管道 - 使用更多 ASP.NET 线程?

ASP.NE网站发布注意事项

缩放 ASP.NET 应用程序

理解ASP.NET Core

ASP.NET 核心标识。使用 ApplicationDbContext 和 UserManager。他们是不是共享上下文?