using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Moonlight.Shared.Http.Responses.Auth; namespace Moonlight.Api.Http.Controllers; [ApiController] [Route("api/auth")] public class AuthController : Controller { private readonly IAuthenticationSchemeProvider SchemeProvider; public AuthController(IAuthenticationSchemeProvider schemeProvider) { SchemeProvider = schemeProvider; } [HttpGet] public async Task> GetSchemesAsync() { var schemes = await SchemeProvider.GetAllSchemesAsync(); return schemes .Where(scheme => !string.IsNullOrWhiteSpace(scheme.DisplayName)) .Select(scheme => new SchemeDto(scheme.Name, scheme.DisplayName!)) .ToArray(); } [HttpGet("{schemeName:alpha}")] public async Task StartAsync([FromRoute] string schemeName) { var scheme = await SchemeProvider.GetSchemeAsync(schemeName); if (scheme == null || string.IsNullOrWhiteSpace(scheme.DisplayName)) return Problem("Invalid authentication scheme name", statusCode: 400); return Challenge(new AuthenticationProperties() { RedirectUri = "/" }, scheme.Name); } [Authorize] [HttpGet("claims")] public Task> GetClaimsAsync() { var result = User.Claims .Select(claim => new ClaimDto(claim.Type, claim.Value)) .ToArray(); return Task.FromResult>(result); } [HttpGet("logout")] public Task LogoutAsync() { return Task.FromResult( SignOut(new AuthenticationProperties() { RedirectUri = "/" }) ); } }