Hangfire の組み込み管理画面は、キュー状態の追跡やバックグラウンドジョブの監視に便利ですが、初期設定では公開されているため、本番環境では適切な認証メカニズムの導入が必須となります。本記事では、`IDashboardAuthorizationFilter` を実装して Basic 認証によるアクセス制限を加え、アプリケーションパイプラインに組み込む手順を解説します。
最初に、アクセス権限の検証ロジックを担うカスタムフィルターを作成します。以下の例では、リクエストヘッダーから認証情報を抽出し、デコード後に検証を行うクラスを定義しています。
public class HangfireAccessValidator : IDashboardAuthorizationFilter
{
private const string ValidUsername = "admin_hangfire";
private const string ValidPassword = "s3cur3_p4ss!";
public bool Authorize([NotNull] DashboardContext context)
{
var httpCtx = context.GetHttpContext();
var authHeader = httpCtx.Request.Headers["Authorization"].ToString();
if (string.IsNullOrWhiteSpace(authHeader) ||
!authHeader.StartsWith("Basic ", StringComparison.OrdinalIgnoreCase))
{
TriggerAuthChallenge(httpCtx);
return false;
}
var token = authHeader.Substring("Basic ".Length);
var decoded = Encoding.UTF8.GetString(Convert.FromBase64String(token));
var creds = decoded.Split(':', StringSplitOptions.RemoveEmptyEntries);
if (creds.Length != 2 || creds[0] != ValidUsername || creds[1] != ValidPassword)
{
TriggerAuthChallenge(httpCtx);
return false;
}
return true;
}
private static void TriggerAuthChallenge(HttpContext ctx)
{
ctx.Response.StatusCode = StatusCodes.Status401Unauthorized;
ctx.Response.Headers["WWW-Authenticate"] = "Basic realm=\"Hangfire Control Panel\"";
ctx.Response.WriteAsync("Access denied. Valid credentials required.");
}
}
次に、作成したフィルターをアプリケーションの起動設定に登録します。`UseHangfireDashboard` メソッドのオプション引数に、先ほどの検証クラスを配列として渡すことで、指定したルート配下のアクセスが制限されます。
// バックグラウンドジョブの処理エンジンを起動
app.UseHangfireServer();
// ダッシュボードの表示パスと認可ルールのマッピング
var dashboardSettings = new DashboardOptions
{
AuthorizationFilters = new IDashboardAuthorizationFilter[]
{
new HangfireAccessValidator()
}
};
app.UseHangfireDashboard("/admin/hangfire", dashboardSettings);
設定が完了したら、ブラウザから定義したエンドポイント(例: `http://localhost:5000/admin/hangfire`)へアクセスします。認証ダイアログが表示されたら、コード内で定義したユーザー名とパスワードを入力します。正しく検証が通れば、Hangfire のジョブ管理インターフェースがレンダリングされ、定期的なタスクの状況や失敗した処理の詳細をリアルタイムで確認できるようになります。