【ASP.NET Core Web】ミドルウェアを使って401などのレスポンスボディにJSONを返す

ネコニウム研究所

PCを利用したモノづくりに関連する情報や超個人的なナレッジを掲載するブログ

【ASP.NET Core Web】ミドルウェアを使って401などのレスポンスボディにJSONを返す

2024-3-18 |

.NET 8のASP.NET Core Webでミドルウェアを使って401などのレスポンスボディにJSONを返したい!

概要

今回の記事では、.NET 8のASP.NET Core Webミドルウェアを使って401などのレスポンスボディにJSONを返す手順を掲載する。

Authorize属性を使ってるコントローラーだと認証されてない状態でアクションにアクセスすると自動的に401を変えてしてくれるんだけども、これのレスポンスボディにJSONを追加したい!

各アクションに処理を書けば実装できるんだけどもめんどいのでなんとかして一括で処理したい!

仕様書

環境

  • .NET 8.0

手順書

いろいろなやり方がありそうだったんだけども私が成功したのはミドルウェアを使った方法のみ。カスタムポリシーやカスタムフィルターを使った方法では私の能力では実装できないかった!無念!

例として401の場合にJSONを追加するミドルウェアを設定する。

namespace MiddlewareSample
{
    public class Json401Middleware
    {
        private readonly RequestDelegate _next;

        public Json401Middleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext context)
        {
            await _next(context);

            if (context.Response.StatusCode == StatusCodes.Status401Unauthorized)
            {
                var response = new { message = "Unauthorized" };
                var jsonResponse = JsonSerializer.Serialize(response);

                context.Response.ContentType = "application/json";
                await context.Response.WriteAsync(jsonResponse);
            }
        }
    }
}

Program.csに先程作ったミドルウェアを使うよう設定を追加する。

namespace MiddlewareSample
{
    public class Program
    {
        public static void Main(string[] args)
        {
            ...

            var app = builder.Build();

            ...

            app.UseMiddleware<Json401Middleware>();

            ...
        }
    }
}

特定のパスでのみミドルウェアを有効にする場合

例えば、api/以下のURLの場合のみミドルウェアを有効にしたい場合の例。

namespace MiddlewareSample
{
    public class Program
    {
        public static void Main(string[] args)
        {
            ...

            var app = builder.Build();

            ...

            app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), builder =>
            {
                app.UseMiddleware<Json401Middleware>();
            }

            ...
        }
    }
}

まとめ(感想文)

APIサーバーなどに使えるかもしれない。