using System.Security.Claims;
using System.Text.Encodings.Web;
using Microsoft.AspNetCore.Authentication;
using Microsoft.Extensions.Options;
namespace KArtSell.Host.Security;
///
/// Development-only authentication. Never enable outside Development.
/// Required headers: X-KArtSell-User and X-KArtSell-Role.
///
public sealed class DevelopmentHeaderAuthenticationHandler(
IOptionsMonitor options,
ILoggerFactory logger,
UrlEncoder encoder,
IWebHostEnvironment environment)
: AuthenticationHandler(options, logger, encoder)
{
protected override Task HandleAuthenticateAsync()
{
if (!environment.IsDevelopment())
{
return Task.FromResult(AuthenticateResult.Fail(
"Development header authentication is disabled outside Development."));
}
var user = Request.Headers["X-KArtSell-User"].ToString();
var role = Request.Headers["X-KArtSell-Role"].ToString();
if (string.IsNullOrWhiteSpace(user) || string.IsNullOrWhiteSpace(role))
{
return Task.FromResult(AuthenticateResult.NoResult());
}
var claims = new[]
{
new Claim(ClaimTypes.NameIdentifier, user),
new Claim(ClaimTypes.Name, user),
new Claim(ClaimTypes.Role, role),
new Claim("auth_mode", "development_header")
};
var identity = new ClaimsIdentity(claims, Scheme.Name);
var principal = new ClaimsPrincipal(identity);
return Task.FromResult(AuthenticateResult.Success(
new AuthenticationTicket(principal, Scheme.Name)));
}
}