using Fengling.AuthService.Data; using Fengling.AuthService.Models; using Microsoft.AspNetCore; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using OpenIddict.Abstractions; using OpenIddict.Server.AspNetCore; using static OpenIddict.Abstractions.OpenIddictConstants; namespace Fengling.AuthService.Controllers; [ApiController] [Route("connect")] public class LogoutController : ControllerBase { private readonly IOpenIddictApplicationManager _applicationManager; private readonly IOpenIddictAuthorizationManager _authorizationManager; private readonly UserManager _userManager; private readonly SignInManager _signInManager; private readonly ILogger _logger; public LogoutController( IOpenIddictApplicationManager applicationManager, IOpenIddictAuthorizationManager authorizationManager, UserManager userManager, SignInManager signInManager, ILogger logger) { _applicationManager = applicationManager; _authorizationManager = authorizationManager; _userManager = userManager; _signInManager = signInManager; _logger = logger; } [HttpGet("endsession")] [HttpPost("endsession")] [IgnoreAntiforgeryToken] public async Task EndSession() { var request = HttpContext.GetOpenIddictServerRequest() ?? throw new InvalidOperationException("OpenIddict request is null"); var result = await HttpContext.AuthenticateAsync(IdentityConstants.ApplicationScheme); if (result.Succeeded) { await _signInManager.SignOutAsync(); } if (request.ClientId != null) { var application = await _applicationManager.FindByClientIdAsync(request.ClientId); if (application != null) { var postLogoutRedirectUri = await _applicationManager.GetPostLogoutRedirectUrisAsync(application); if (!string.IsNullOrEmpty(request.PostLogoutRedirectUri)) { if (postLogoutRedirectUri.Contains(request.PostLogoutRedirectUri)) { return Redirect(request.PostLogoutRedirectUri); } } } } return Redirect("/"); } }