web-dev-qa-db-fra.com

HttpContext.Authentication.SignOutAsync ne supprime pas le cookie d'authentification

Selon ASP.NET Core documentation , la méthode HttpContext.Authentication.SignOutAsync() doit également supprimer le cookie d'authentification.

Déconnexion

Pour déconnecter l'utilisateur actuel et supprimer leur cookie} _ (italics mine - A.C.), appelez le numéro suivant dans votre contrôleur

await HttpContext.Authentication.SignOutAsync("MyCookieMiddlewareInstance");

Mais ce n'est pas le cas! Tout le reste semble bien, esp. schéma d'authentification, car l'utilisateur est correctement connecté et le cookie .AspNetCore. est créé.

Des idées pour lesquelles un cookie reste après la désactivation de l'utilisateur?

13
Alexander Christov

Vous n'avez pas posté suffisamment de code, mais je suppose qu'après avoir appelé SignOutAsync, vous avez un type de redirection (par exemple, RedirectToAction) qui écrase la redirection vers l'URL de fin de OIDC que SignOutAsync tente de générer.

(La même explication du problème d’écrasement de la redirection est donnée ici par HaoK de Microsoft.)

Edit: Si ma spéculation ci-dessus est correcte, la solution consiste à envoyer une URL de redirection dans un objet AuthenticationProperties avec la dernière variable 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);
}
5
McGuireV10

J'ai le même problème… .. SignOutAsync ne fonctionne pas correctement. 

J'ai trouvé ça: 

Response.Cookies.Delete(".AspNetCore.<nameofcookie>");
2
Castro JR

J'ai résolu le problème de suppression des cookies de mon site avec l'extrait suivant placé dans la méthode Logout () du contrôleur. J'ai constaté que plusieurs cookies seraient créés par mon site.

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

Et dans Startup.cs:

app.UseCookieAuthentication(new CookieAuthenticationOptions()
            {
                AuthenticationScheme = "Cookies",
                LoginPath = new PathString("/Account/Login/"),
                AccessDeniedPath = new PathString("/Home/Index/"),
                AutomaticAuthenticate = true,
                AutomaticChallenge = true,
                CookieName = ".MyCookie"
            });

Notez que je n'utilise pas await HttpContext.Authentication.SignOutAsync("MyCookieMiddlewareInstance"); puisque j'utilise OpenIdConnect avec Google.

2
JTvermose

Voici le code qui supprime le cookie (Si rien d’autre n’aide, utilisez la force brutale):

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

Mauvais mauvais mauvais! On dirait un patch très laid! Mais ça marche ... :(

Touteautresolutions?

0
Alexander Christov