在.Net Core中除wwwroot

时间:2018-07-27 21:15:28

标签: angular asp.net-core

正如帖子标题所暗示的那样,我正在尝试构建一个还托管Angular应用程序的.Net Core Web应用程序。 .Net Core Web应用程序充当Angular应用程序的包装,以保护Angular应用程序的所有资源(图像,脚本等),以便仅在用户通过身份验证后才能访问它们。

我已经阅读了很多有关在.Net Core站点中部署Angular应用程序的帖子,但是似乎它们似乎都是基于将Angular文件放入wwwroot的。但是,这样做并不能满足我的要求,直到身份验证之后才能锁定所有资源。用户工作流程应该是当他们访问该站点时,将其重定向到登录页面,并在成功进行身份验证后将其发送到控制器方法,该方法是Angular应用程序的入口点。

我发现this post似乎很符合我的需求,但是没有成功的答案,所以以为我自己发布问题。

我在研究中也发现了Static Files in ASP.NET Core的文档,其中指出了有关静态文件的以下内容:

  

静态文件中间件不提供授权检查。它提供的任何文件,包括wwwroot下的文件,都是可以公开访问的。要根据授权提供文件:

     
      
  1. 将它们存储在wwwroot以及静态文件中间件可访问的任何目录之外,并且
  2.   
  3. 通过应用了授权的操作方法为他们提供服务。返回FileResult对象
  4.   

在阅读,思考和使用它之后,我突然想到一个问题:鉴于上面提到的David在另一个问题中提出的困难,这是否意味着如果您想锁定静态文件并需要进行身份验证,提供文件的唯一方法是通过返回FileResult的控制器操作,这意味着必须通过此控制器方法访问Angular应用程序的任何脚本文件或图像文件资产?大概,那么,您将不得不通过URL引用这些文件,这将导致控制器方法返回该文件。

如果是这样的话,考虑到Angular CLI对脚本进行分块的方式,这似乎是一个站不住脚的解决方案。我理解正确吗?有没有更合适的方法来锁定所有与角度相关的资源,直到用户通过身份验证为止?

2 个答案:

答案 0 :(得分:0)

正如您所说,一种解决方案是将Angular工件捆绑到.NET Core wwwroot /中,这会限制您的使用。

我认为您在想一个更好的解决方案还只是半途而废,但是我不认为强迫kestrel在wwwroot /之外提供静态文件是解决方案。

将Angular打包到.NET Core的wwwroot /中时,您基本上是在利用已经运行的kestrel作为Web服务器来托管Angular应用程序,而kestrel唯一需要做的就是提供静态文件。 Angular对.NET Core应用程序的唯一依赖关系是API端点。

话虽这么说,我认为最佳的解决方案是不要试图依靠红k作为Angular应用程序的主机。

尽管有很多选择,但我将使用Nginx或IIS,它们将充当反向代理,以便为您的每个应用程序提供服务。

我目前正在一个项目上,该项目具有均在Docker上运行的.NET Core API,Angular应用程序和Mongo数据库实例。它运作良好,我知道这是一个可行的解决方案。

更新

根据您的最新评论,我意识到您所要的不是编码解决方案,而是IIS配置/权限解决方案。

就像您说的那样,Kestrel不提供用于提供静态文件的授权,并且您不想通过控制器提供每个文件。您显然已经阅读并理解了ASP.NET Core Docs的“静态文件”部分,因此我们还需要其他内容。

查看this article,并告诉我是否有帮助。

答案 1 :(得分:0)

我感谢您做出的努力。最终,我能够到达需要的地方,部分是基于对this question.

的回答

为解决此问题,我在站点中创建了一个文件夹来保存我的角度应用程序。使用有关创建自定义中间件的另一个问题的信息,我能够创建用于保护我的静态角度文件夹内容的中间件。我在我的startup.cs中添加了该中间件,引用了我的角度文件的路径,然后添加了一个app.UseStaticFiles条目,该条目提供对我创建的角度目录的访问。

通过将中间件放置在该目录的StaticFiles中间件之前,它可以在提供静态文件之前评估用户策略身份验证。

这最终确实在角度应用程序中给很多路径结构带来了破坏,但是我能够遍历所有路径结构以设置适当的构建属性,等等,这样我现在就可以构建角度应用程序并将其放入我的客户端应用程序的静态文件夹,并且都受.net身份验证的保护。