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?
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);
}
J'ai le même problème… .. SignOutAsync ne fonctionne pas correctement.
J'ai trouvé ça:
Response.Cookies.Delete(".AspNetCore.<nameofcookie>");
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.
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?