using MemberCenter.Api.Extensions; using MemberCenter.Infrastructure.Identity; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using OpenIddict.Abstractions; using OpenIddict.Server.AspNetCore; namespace MemberCenter.Api.Controllers; [ApiController] public class TokenController : ControllerBase { private readonly UserManager _userManager; private readonly SignInManager _signInManager; public TokenController(UserManager userManager, SignInManager signInManager) { _userManager = userManager; _signInManager = signInManager; } [HttpPost("/oauth/token")] [HttpPost("/auth/login")] [HttpPost("/auth/refresh")] public async Task Exchange() { var request = HttpContext.Features.Get()?.Transaction?.Request; if (request is null) { return BadRequest("Invalid OpenIddict request."); } if (request.IsPasswordGrantType()) { var user = await _userManager.FindByEmailAsync(request.Username ?? string.Empty); if (user is null) { return Forbid(OpenIddictServerAspNetCoreDefaults.AuthenticationScheme); } var valid = await _userManager.CheckPasswordAsync(user, request.Password ?? string.Empty); if (!valid) { return Forbid(OpenIddictServerAspNetCoreDefaults.AuthenticationScheme); } var principal = await _signInManager.CreateUserPrincipalAsync(user); var scopes = request.Scope.GetScopesOrDefault(); principal.SetScopes(scopes); foreach (var claim in principal.Claims) { claim.SetDestinations(ClaimsExtensions.GetDestinations(claim)); } return SignIn(principal, OpenIddictServerAspNetCoreDefaults.AuthenticationScheme); } if (request.IsRefreshTokenGrantType()) { var authenticateResult = await HttpContext.AuthenticateAsync(OpenIddictServerAspNetCoreDefaults.AuthenticationScheme); if (!authenticateResult.Succeeded || authenticateResult.Principal is null) { return Forbid(OpenIddictServerAspNetCoreDefaults.AuthenticationScheme); } var principal = authenticateResult.Principal; return SignIn(principal, OpenIddictServerAspNetCoreDefaults.AuthenticationScheme); } return BadRequest("Unsupported grant type."); } }