2

我们在企业环境中需要从 ASP.NET Core 应用程序的网络共享中提供静态文件内容。基本上,它在某个子路径下提供服务/content。为此,我们有以下代码,可以正常工作:

app.UseFileServer(new FileServerOptions
{
    FileProvider = new PhysicalFileProvider("//our/network/share"),
    RequestPath = new PathString("/content"),
    EnableDirectoryBrowsing = false
});

现在在生产环境中,托管 Web 应用程序的系统用户无法访问文件共享。因此,我们必须使用某个技术域用户来访问文件,为此我们必须向文件服务器提供该系统用户的凭据(用户名/密码)。

不幸的是,我们没有找到向UseFileServer(). 反正有可能吗?

4

3 回答 3

1

是的,这些答案假设您正在询问客户端凭据。您真正需要的是具有访问特定资源的凭据的 IFileProvider 实现。我不知道 .NET 非常擅长以不同用户的身份访问文件,它通常依赖于模拟。请参阅如何出示凭据以打开文件?

于 2016-06-24T16:57:22.927 回答
1

我会使用中间件来保护内容。我将尝试编写简单的示例(我假设您正在使用任何身份验证中间件来验证您的用户,我的示例是针对静态文件的)。

-- 下面的代码未经测试,仅用于说明--

首先,您需要创建一个像这样的中间件:

public class ProtectFileMiddleware
{
    private readonly RequestDelegate _next;

    public ProtectFileMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        if (context.Request.Path.StartsWithSegments("/protected"))
        {
            if (!context.User.IsInRole("Admin"))
            {
                await context.Authentication.ChallengeAsync();
                return;
            }
        }
        await _next(context);

    }
}

并使用如下中间件:

    public void Configure(IApplicationBuilder app)
    {
        app.Use(?)Authentication();// it depends on your design
        app.UseMiddleware<ProtectFileMiddleware>();
        app.UseStaticFiles();

        // other
    }

结果:如果您尝试以/protected管理员用户身份访问 url,您将收到预期的响应,否则您将收到 401/403 响应。

如需更灵活的方式,请查看http://odetocode.com/blogs/scott/archive/2015/10/06/authorization-policies-and-middleware-in-asp-net-5.aspx

于 2016-06-24T07:50:28.163 回答
1

根据 UseFileServer 的文档,它结合了UseStaticFiles的功能。根据中间件文档,静态文件模块不提供身份验证检查。他们确实为您提供了一些关于如何通过授权完成文件服务的选项(同样来自中间件文档):

如果要根据授权提供文件:

  1. 将它们存储在 wwwroot 和静态文件中间件可访问的任何目录之外。
  2. 通过控制器操作传递它们,返回应用授权的 FileResult。

不确定如何将用户名/密码传递给服务器。如果您打算使用基本身份验证之类的东西(并且不想使用上面概述的方法),您可能可以修改标题(在提供静态文件时)以达到预期的效果,但这是一种解决方法,可能不会一个好主意。

于 2016-06-24T06:16:49.707 回答