なつねこメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ 書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

ASP.NET Core で SPA の Static File も認証で保護したい

ASP.NET Core で UseSpa とかで SPA アプリケーションをホストできるんですが、例えば Staging 環境だったり、何らかの理由で特定ディレクトリ以下のアクセスを拒否したいケースがあります。 その場合、 Authorize 属性を通過しないので、自前で認証のチャレンジを送信する必要があります。 その方法についてのメモ。

といっても簡単で、以下のようにすれば OK。

app.Map("/protected", @protected => {
  @protected.UseSpa(opts => {
    opts.Options.DefaultPageStaticFileOptions = new StaticFileOptions {
      FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "protected")),
      OnPrepareResponse = ctx => {
        if (ctx.Context.User.Identity is { IsAuthenticated: true }) {
          return;
        }

        ctx.Context.Response.StatusCode = (int) HttpStatusCode.Unauthorized;
        ctx.Context.Response.ContentLength = 0;
        ctx.Context.Response.Body = Stream.Null; // これ設定しないと、中身返っちゃうから注意!
        ctx.Context.ChallengeAsync(); // 投げっぱなしでよい
      },
    };
  });
});

この場合、 http://localhost/protected にアクセスしたら、裏の React だったりの index.html は Basic 認証だったり、なんらかの認証をしていなければ返りません。 ということで、メモでした。