首页 > 解决方案 > 通过自定义身份验证过滤器(或等效过滤器)发送对静态 .htm 文件的请求

问题描述

我有一个 ASP.NET MVC 应用程序,其中我在应用程序的几个部分使用自定义授权过滤器。

[MyCustomAuthorize]
class MyController
{
}

这在很长一段时间内都运作良好。

现在我想在应用程序中添加另一部分,它基本上是一个预构建的 React 应用程序 - 一个包含 index.htm 文件、JS、CSS 和其他资源文件的子文件夹结构。

当用户导航到此子应用程序时,我希望通过在我的自定义授权属性中实现的相同授权过程来发送它们。但很自然,因为它是一个静态的 .htm 文件,我无法对其应用任何属性。

我试图通过将它放在 MVC 控制器后面来解决这个问题:

using MyApp.Filters;
using System.Web.Mvc;

namespace MyApp.Controllers
{
    [MyCustomAuthorize]
    public class SubAppController : Controller
    {
        public ActionResult Index()
        {
            return File("~/SubApp/index.htm", "text/html");
        }
    }
}

但似乎如果我导航到 https://mydomain/SubApp/ 会发生什么是 IIS 找到 index.htm 文件并提供它而不是请求通过控制器。

如果我将 index.htm 重命名为其他名称并尝试以这种方式提供它:

using MyApp.Filters;
using System.Web.Mvc;

namespace MyApp.Controllers
{
    [MyCustomAuthorize]
    public class SubAppController : Controller
    {
        public ActionResult Index()
        {
            return File("~/SubApp/subapp.htm", "text/html");
        }
    }
}

然后似乎 IIS 将 https://mydomain/SubApp/ 请求视为访问物理 SubApp/ 文件夹的尝试,并返回 403 响应。

我意识到我可以通过将子应用程序内容物理放置在与控制器名称不同的文件夹中来解决这两个问题,但这会引入另一个问题,即所有子应用程序的资源文件(CSS、JS 等) .) 不再位于访问子应用程序的路径的子路径中(即浏览器将访问 https://mydomain/SubApp/ 并且 .css 将位于 https://mydomain/SubAppFiles /styles.css)。如果可能,我想避免这种情况,并将所有资源(物理上和概念上)包含在 SubApp/ 文件夹中。

有没有一种相对简单的方法可以让它很好地工作而无需对主应用程序进行过多的检修?

我认为理想的情况是找到某种方法让 IIS尝试处理对https://mydomain/SubApp/(仅是一条路径而没有别的)的请求并允许 ASP.NET 应用程序处理它,但到目前为止,我一直没有成功地找到一种方法来做到这一点。

标签: c#asp.net-mvc

解决方案


推荐阅读