According to ASP.NET Core documentation the method HttpContext.Authentication.SignOutAsync() must delete the authentication cookie as well.
Signing out
To sign out the current user, and delete their cookie (italics mine - A.C.) call the following inside your controller
await HttpContext.Authentication.SignOutAsync("MyCookieMiddlewareInstance");
But it does not! Everything else seems okay, esp. auth scheme, because user gets signed-in correctly and the cookie .AspNetCore. is created.
Any ideas why cookie remains after the user's sing-out?
You didn't post enough code to tell, but I suspect after you call SignOutAsync you have some type of redirect (for example, RedirectToAction) which overwrites the redirect to the OIDC endsession URL that SignOutAsync tries to issue.
(The same explanation for the redirect overwrite problem is given here by Microsoft's HaoK.)
Edit: If my speculation above is correct, the solution is to send a redirect URL in an AuthenticationProperties object with the final SignOutAsync:
// in some controller/handler, notice the "bare" Task return value public async Task LogoutAction() { // SomeOtherPage is where we redirect to after signout await MyCustomSignOut("/SomeOtherPage"); } // probably in some utility service public async Task MyCustomSignOut(string redirectUri) { // inject the HttpContextAccessor to get "context" await context.SignOutAsync("Cookies"); var prop = new AuthenticationProperties() { RedirectUri = redirectUri }; // after signout this will redirect to your provided target await context.SignOutAsync("oidc", prop); }
I had the same issue recently. In my case, the browser had created multiple cookies. One with a name like ".AspNetCore.Antiforgery" and another one with a custom name that I had set for my cookie in startup.cs.
What solved the error for me was the first part of JTvermose's answer with some changes. I added the code below to my logout method. Worked like a charm.
if (HttpContext.Request.Cookies.Count> 0) { var siteCookies = HttpContext.Request.Cookies.Where(c => c.Key.Contains(".AspNetCore.") || c.Key.Contains("Microsoft.Authentication")); foreach (var cookie in siteCookies) { Response.Cookies.Delete(cookie.Key); } } await HttpContext.SignOutAsync( CookieAuthenticationDefaults.AuthenticationScheme); HttpContext.Session.Clear(); return RedirectToPage("/Index");
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