我的目标是保护静态文件夹(包含文档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
项目的一部分。
答案 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>