using System.Security.Claims; using System.Text.Encodings.Web; using Microsoft.AspNetCore.Authentication; using Microsoft.Extensions.Options; namespace BackendStarter.Api.Security; public sealed class HeaderTokenAuthHandler : AuthenticationHandler { public const string SchemeName = "BackendStarterHeader"; public const string HeaderName = "X-Demo-Token"; private readonly IConfiguration _configuration; public HeaderTokenAuthHandler( IOptionsMonitor options, ILoggerFactory logger, UrlEncoder encoder, IConfiguration configuration) : base(options, logger, encoder) { _configuration = configuration; } protected override Task HandleAuthenticateAsync() { if (!Request.Headers.TryGetValue(HeaderName, out var headerValue)) { return Task.FromResult(AuthenticateResult.NoResult()); } var expectedToken = _configuration["DemoAuth:Token"]; if (string.IsNullOrWhiteSpace(expectedToken) || headerValue.ToString() != expectedToken) { return Task.FromResult(AuthenticateResult.Fail("Invalid demo token.")); } var claims = new[] { new Claim(ClaimTypes.NameIdentifier, "tutorial-user"), new Claim(ClaimTypes.Name, "tutorial-user") }; var identity = new ClaimsIdentity(claims, SchemeName); var principal = new ClaimsPrincipal(identity); var ticket = new AuthenticationTicket(principal, SchemeName); return Task.FromResult(AuthenticateResult.Success(ticket)); } }