主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ
書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。
2023/02/12
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 認証だったり、なんらかの認証をしていなければ返りません。
ということで、メモでした。