ASP.NET Coreにおける静的リソースのアクセス制御実装

ASP.NET Coreアプリケーションで、wwwrootディレクトリ内の静的リソース(MP3、MP4ファイルなど)へのアクセスを認証制御する方法を解説します。特定のユーザーのみがアクセス可能なよう、Middlewareを活用した実装手順を以下に示します。

Startup.csConfigureメソッド内で、assetsを含むパスのリクエストを専用のミドルウェアで処理するよう設定します。この際、静的ファイルの提供は後続で行う必要があります。

app.UseWhen(context => context.Request.Path.ToString().Contains("assets"), builder => builder.UseMiddleware<FileAccessControlMiddleware>());app.UseStaticFiles();

次に、FileAccessControlMiddlewareクラスを実装します。このミドルウェアはリクエストヘッダーから認証情報を取得し、サービス層でアクセス権限を検証します。

using Microsoft.AspNetCore.Http;using System.Threading.Tasks;namespace SampleApp.Middleware{    public class FileAccessControlMiddleware    {        private readonly RequestDelegate _next;        private readonly IFileAccessService _fileService;        public FileAccessControlMiddleware(RequestDelegate next, IFileAccessService fileService)        {            _next = next;            _fileService = fileService;        }        public async Task Invoke(HttpContext httpContext, IAuthorizationService authService)        {            var authToken = httpContext.Request.Headers["X-Auth-Token"].ToString();            if (string.IsNullOrWhiteSpace(authToken))            {                throw new UnauthorizedAccessException("有効な認証トークンがありません");            }            var accessCheck = _fileService.CheckResourceAccess(new ResourceAccessCheckRequest            {                FullUrl = httpContext.Request.GetAbsoluteUri(),                Token = authToken            });            if (!accessCheck.IsAuthorized)            {                await httpContext.ForbidAsync();            }            await _next(httpContext);        }    }}

リソースアクセス検証ロジックは、サービス層で実装します。以下は注文情報を確認する例です。

public class FileAccessService : IFileAccessService{    public ResourceAccessCheckResponse CheckResourceAccess(ResourceAccessCheckRequest request)    {        var currentUser = GetUserByToken(request.Token);        if (string.IsNullOrEmpty(request.FullUrl))        {            throw new ArgumentException("URLが指定されていません");        }        request.FullUrl = request.FullUrl.Trim().ToLower();        if (request.FullUrl.EndsWith(".mp3") || request.FullUrl.EndsWith(".mp4"))        {            // 注文情報に基づくアクセス権限チェック            // 例:orderService.HasValidOrder(currentUser.Id, request.FullUrl);        }        return new ResourceAccessCheckResponse { IsAuthorized = true };    }}

タグ: aspnetcore staticfiles Middleware authorization authentication

6月27日 22:36 投稿