Files
forkmessager/apps/server-net/src/Shared/Knot.Shared.Infrastructure/Middleware/AdminAuthMiddleware.cs
Халимов Рустам 8f2de0e9bf Форматирование
2026-03-19 01:31:43 +03:00

63 lines
2.0 KiB
C#

using System.Net.Http.Headers;
using System.Text;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
namespace Knot.Shared.Infrastructure.Middleware;
public class AdminAuthMiddleware
{
private readonly RequestDelegate _next;
public AdminAuthMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context, IConfiguration configuration)
{
if (context.Request.Path.StartsWithSegments("/api/admin"))
{
var expectedUser = configuration["KNOT_ADMIN_USER"];
var expectedPass = configuration["KNOT_ADMIN_PASSWORD"];
if (string.IsNullOrEmpty(expectedUser) || string.IsNullOrEmpty(expectedPass))
{
context.Response.StatusCode = 500;
await context.Response.WriteAsync("Admin credentials not configured on server.");
return;
}
if (!context.Request.Headers.ContainsKey("Authorization"))
{
context.Response.Headers.Append("WWW-Authenticate", "Basic realm=\"Admin Area\"");
context.Response.StatusCode = 401;
return;
}
try
{
var authHeader = AuthenticationHeaderValue.Parse(context.Request.Headers["Authorization"]);
var credentialBytes = Convert.FromBase64String(authHeader.Parameter ?? string.Empty);
var credentials = Encoding.UTF8.GetString(credentialBytes).Split(':', 2);
var username = credentials[0];
var password = credentials[1];
if (username != expectedUser || password != expectedPass)
{
context.Response.StatusCode = 403;
return;
}
}
catch
{
context.Response.StatusCode = 401;
return;
}
}
await _next(context);
}
}