I'm trying to implement external login/logout for a webpage (asp net core 3.1) with OpenId Connect (oidc) as the login provder. Login is working fine, but logout redirection isn't working as intended. I'm sure there's an easy fix to it, but i'm fairly new to .NET development. Here's what I've tried so far without success:
The HTML for logout is as such:
<form class="form-inline" asp-area="Identity" asp-page="/Account/Logout">
<button type="submit" class="nav-link btn btn-link text-light">Logg ut</button>
</form>
The Logout.cshtml.cs:
//public async Task<IActionResult> OnPost(string returnUrl = null)
//{
// await _signInManager.SignOutAsync();
// await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
// await HttpContext.SignOutAsync(OpenIdConnectDefaults.AuthenticationScheme);
// _logger.LogInformation("User logged out.");
// if (returnUrl != null)
// {
// return LocalRedirect(returnUrl);
// }
// else
// {
// return RedirectToPage();
// }
//}
public async Task<IActionResult> OnPost()
{
var user = HttpContext.User;
if (user?.Identity.IsAuthenticated == true)
{
await _signInManager.SignOutAsync();
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
}
//await HttpContext.SignOutAsync(OpenIdConnectDefaults.AuthenticationScheme);
var callbackUrl = Url.Page("/Account/Logout", pageHandler: null, values: null, protocol: Request.Scheme);
return SignOut(new AuthenticationProperties { RedirectUri = callbackUrl }, CookieAuthenticationDefaults.AuthenticationScheme, OpenIdConnectDefaults.AuthenticationScheme);
}
In startup.cs
//options.SignedOutCallbackPath = "/Identity/Account/Logout";
options.SignedOutRedirectUri = "/Identity/Account/Logout";
//options.RemoteSignOutPath = "/Identity/Account/Logout";
options.Events = new OpenIdConnectEvents
{
//OnSignedOutCallbackRedirect = (c) =>
//{
// c.Response.Redirect("/Identity/Account/Logout)");
// c.HandleResponse();
// return Task.CompletedTask;
//},
Redirect uri set at loginprovider:
Closest I got to a redirect of sorts (The OnPost function is not called at all) was using RemoteSignOutPath, but that just returns a blank page at /Identity/Account/Logout.
Edit: To clarify, as it is now I am able to logout and the OnPost function is called, but at logout the user is redirected to the loginproviders own /loggedout page with info about the user being logged out of the application.
The logout should not return any IActionResult, instead it should look like this:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task Logout()
{
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
await HttpContext.SignOutAsync(OpenIdConnectDefaults.AuthenticationScheme);
}
If you want to set where to redirect to, then you pass that as a parameter to the SignOutAsync method, like this:
var prop = new AuthenticationProperties()
{
RedirectUri = redirectUri
};
then pass it to the SignOutAsync method like:
await context.SignOutAsync(OpenIdConnectDefaults, prop);
Give it a try!
Please, use this simple sample:
[HttpGet]
public async Task<IActionResult> Logout()
{
var user = HttpContext.User;
if (user?.Identity.IsAuthenticated == true)
{
await _signInManager.SignOutAsync();
}
return View("Home");
}
<a class="dropdown-item" asp-action="Logout" asp-controller="Account">Logout</a>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With