簡體   English   中英

如何僅向授權用戶提供靜態文件?

[英]How do I serve static files only to authorized users?

我有一組Excel電子表格,我只想在授權用戶的ASP.NET 5 webapp中提供這些電子表格。

  1. 我應該在哪里存儲文件? 我假設在wwwroot(例如,wwwroot / files)。
  2. 如果在wwwroot中,如何僅允許授權用戶訪問? (我想將它們作為來自控制器的[Authorize] FileResult提供,但是這仍然保持文件可以通過我認為的URL直接訪問。)
  3. 如何通過控制器中的FileResult操作引用wwwroot中的位置?

非常感謝!

是的,他們應該進入wwwroot 目前沒有內置的方法來保護wwwroot目錄。 但創建一個中間件模塊來完成它是非常簡單的。 有一個簡單的按照教程這里

如果你不熟悉開發中間件,我發布了一個GitHub項目,它展示了如何通過三個簡單的步驟創建中間件。 您可以在此處下載該項目。

您不需要控制器來訪問靜態文件。

在.net核心中創建一個與wwwroot相同級別的專用目錄www,並使用以下代碼:

public HomeController(IHostingEnvironment hostingEnvironment)
{
    _hostingEnvironment = hostingEnvironment;
}

[Authorize(Roles = "SomeRole")]
public IActionResult Performance()
{
    return PhysicalFile(Path.Combine(_hostingEnvironment.ContentRootPath,
                                     "www", "MyStaticFile.pdf"), "application/pdf");
}

基於以下答案(針對.netCore): 靜態文件授權

檢索文件時進行身份驗證檢查:

        app.UseStaticFiles(new StaticFileOptions()
        {
            OnPrepareResponse = (context) =>
            {
                if (!context.Context.User.Identity.IsAuthenticated && context.Context.Request.Path.StartsWithSegments("/excelfiles"))
                {
                    throw new Exception("Not authenticated");
                }
            }
        });

如果您有登錄表單(Login.html),一個簡單的解決方案是,如果用戶未經過身份驗證並且他正在請求受保護資源(/ protected文件夾下的文件),則會將用戶重定向到登錄頁面。 在Startup.cs中,在Configure方法中插入以下代碼:

app.Use(async (context, next) =>
{
    if (!context.User.Identity.IsAuthenticated && context.Request.Path.StartsWithSegments("/protected"))
    {
        context.Response.Redirect("/Login.html");
        return;
    }
    await next.Invoke();
});

這是一個非常簡單的示例,但可以更改它以檢查特定角色,並且可以將代碼移出Startup.cs以獲得更大的靈活性。

app.Use(async (context, next) =>
               {
                   if (!context.User.Identity.IsAuthenticated
                       && context.Request.Path.StartsWithSegments("/excelfiles"))
                   {
                       throw new Exception("Not authenticated");
                   }
                   await next.Invoke();
               });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM