HttpContext.Authentication.SignOutAsync не удаляет auth cookie
В соответствии с документацией ASP.NET Core метод HttpContext.Authentication.SignOutAsync()
должен также удалить файл cookie проверки подлинности.
Выйти
Чтобы выйти из текущего пользователя и удалить их cookie (курсив мой - A.C.), вызовите следующее внутри вашего контроллера.
await HttpContext.Authentication.SignOutAsync("MyCookieMiddlewareInstance");
Но это не так! Все остальное выглядит хорошо, особенно. auth, потому что пользователь правильно выполняет вход в систему и файл cookie.AspNetCore..
Любые идеи, почему файл cookie остается после выключения пользователя?
Ответы
Ответ 1
Вы не опубликовали достаточно кода, чтобы сказать, но я подозреваю, что после вызова SignOutAsync
у вас есть какой-то тип перенаправления (например, RedirectToAction
), который перезаписывает перенаправление на URL-адрес конца OIDC, который SignOutAsync
пытается выдавать.
(То же объяснение для проблемы переадресации пересылки дано здесь от Microsoft HaoK.)
Изменить: если мое предположение верно, решение должно отправить URL-адрес перенаправления в объект AuthenticationProperties
с окончательным 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);
}
Ответ 2
У меня такая же проблема.
SignOutAsync не работает должным образом.
Я нашел это:
Response.Cookies.Delete(".AspNetCore.<nameofcookie>");
Ответ 3
Я решил проблему с удалением файлов своего сайта с помощью следующего фрагмента, помещенного в мой метод Logout() в контроллере. Я обнаружил, что на моем сайте будет создано несколько файлов cookie.
// Delete the authentication cookie(s) we created when user signed in
if (HttpContext.Request.Cookies[".MyCookie"] != null)
{
var siteCookies = HttpContext.Request.Cookies.Where(c => c.Key.StartsWith(".MyCookie"));
foreach (var cookie in siteCookies)
{
Response.Cookies.Delete(cookie.Key);
}
}
И в Startup.cs:
app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
AuthenticationScheme = "Cookies",
LoginPath = new PathString("/Account/Login/"),
AccessDeniedPath = new PathString("/Home/Index/"),
AutomaticAuthenticate = true,
AutomaticChallenge = true,
CookieName = ".MyCookie"
});
Обратите внимание, что я не использую await HttpContext.Authentication.SignOutAsync("MyCookieMiddlewareInstance");
, так как я использую OpenIdConnect с Google.
Ответ 4
Здесь код, который удаляет файл cookie (если ничего не помогает, используйте грубую силу):
await this.HttpContext.Authentication.SignOutAsync(<AuthenticationScheme>);
// ...
var cookie = this.Request.Cookies[<CookieName>];
if (cookie != null)
{
var options = new CookieOptions { Expires = DateTime.Now.AddDays(-1) };
this.Response.Cookies.Append(cookieName, cookie, options);
}
Плохо, плохо, плохо! Кажется, очень уродливый патч! Но работает...: (
Любые другие решения?
Ответ 5
Решил проблему с этой первой строкой.
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
// await _SignInManager.SignOutAsync();
// HttpContext.Response.Cookies.Delete(".AspNetCore.Cookies");
Ответ 6
public async Task<IActionResult> LogoutAsync()
{
await _signInManager.SignOutAsync();
await this.HttpContext.SignOutAsync("Identity.Application");
return RedirectToAction(Actions.Index.ToString(), ControllersName.Home.ToString());
}