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 認証だったり、なんらかの認証をしていなければ返りません。
ということで、メモでした。