72 lines
2.5 KiB
C#
72 lines
2.5 KiB
C#
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<ApplicationUser> _userManager;
|
|
private readonly SignInManager<ApplicationUser> _signInManager;
|
|
private readonly ILogger<LogoutController> _logger;
|
|
|
|
public LogoutController(
|
|
IOpenIddictApplicationManager applicationManager,
|
|
IOpenIddictAuthorizationManager authorizationManager,
|
|
UserManager<ApplicationUser> userManager,
|
|
SignInManager<ApplicationUser> signInManager,
|
|
ILogger<LogoutController> logger)
|
|
{
|
|
_applicationManager = applicationManager;
|
|
_authorizationManager = authorizationManager;
|
|
_userManager = userManager;
|
|
_signInManager = signInManager;
|
|
_logger = logger;
|
|
}
|
|
|
|
[HttpGet("endsession")]
|
|
[HttpPost("endsession")]
|
|
[IgnoreAntiforgeryToken]
|
|
public async Task<IActionResult> 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("/");
|
|
}
|
|
}
|