web-dev-qa-db-ja.com

許可されたユーザーにのみ静的ファイルを提供するにはどうすればよいですか?

ASP.NET 5 webappで承認されたユーザーのみに提供したいExcelスプレッドシートのコレクションがあります。

  1. ファイルはどこに保存すればよいですか? wwwroot(例:wwwroot/files)を想定しています。
  2. Wwwrootの場合、許可されたユーザーのみにアクセスを許可するにはどうすればよいですか? (コントローラーから[Authorize] FileResultとして提供したいのですが、これにより、ファイルを開いたままにして、URLから直接アクセスできるようになります。)
  3. コントローラーのFileResultアクションを介してwwwrootの場所を参照するにはどうすればよいですか?

どうもありがとう!

25
Gabe

はい、wwwrootに入れる必要があります。現在、wwwrootディレクトリを保護する組み込みの方法はありません。しかし、それを達成するためのミドルウェアモジュールの作成は非常に簡単です。簡単なチュートリアル here があります。

ミドルウェアの開発に慣れていない場合は、3つの簡単なステップでミドルウェアを作成する方法を示すGitHubプロジェクトを投稿しました。プロジェクトをダウンロードできます こちら

静的ファイルにアクセスするためにコントローラーは必要ありません。

25
Clint B

.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の場合): static file authorization

9
Guy

ファイルの取得中の認証チェックの場合:

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

ログインフォーム(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();
});
2
Renzo Ciot

これは非常に単純な例ですが、特定の役割を確認するように変更でき、コードを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();
               });
1
Pragmatic Coder