保护ASP.NET Core Web API背后的虚拟目录(IIS)

时间:2018-06-22 05:03:11

标签: c# iis asp.net-core web-config

我的目标是保护静态文件夹(包含文档html内容)不受公共访问。身份验证应在由同一IIS实例托管的外部API(.net核心)中进行。

我的第一个尝试是拦截Request并查找特定路径。如果用户未经身份验证,则将其重定向到登录页面。

app.UseAuthentication();

app.Use(async (ctx, next) =>
{
    if (!ctx.User.Identity.IsAuthenticated && 
         ctx.Request.Path.StartsWithSegments(docsPath))
    {
        await ctx.ChallengeAsync();
        return;
    }
    await next.Invoke();
});

app.UseStaticFiles();

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Account}/{action=Login}/{id?}");
});

但是,该请求首先由IIS处理,然后路由到文档,而无需触摸Middleware
有什么方法可以完成正确的行为?

提示:文档应该进入wwwroot或成为API项目的一部分。

1 个答案:

答案 0 :(得分:0)

您的问题是,身份验证中间件仅处理具有Authorize属性的控制器。
recommended way for .Net Core将使用常规方法:

  

要基于授权提供文件:将文件存储在wwwroot之外   以及静态文件中间件和服务可访问的任何目录   通过应用授权的操作方法来实现。返回一个   FileResult对象:

[Authorize]
public IActionResult BannerImage()
{
    var file = Path.Combine(Directory.GetCurrentDirectory(), 
                            "MyStaticFiles", "images", "banner1.svg");

    return PhysicalFile(file, "image/svg+xml");
}

但是,正如您所说,如果docs目录根本不在API项目之外,则可以通过放置自定义web.config尝试依赖IIS身份验证:

<authorization>
  <deny users="?" />
</authorization>