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());
    }