it-swarm.com.de

HttpContext.Authentication.SignOutAsync löscht kein Auth-Cookie

Gemäß ASP.NET Core documentation muss die Methode HttpContext.Authentication.SignOutAsync() auch das Authentifizierungs-Cookie löschen.

Abmelden

Um den aktuellen Benutzer abzumelden, rufen Sie mit löschen Sie sein Cookie (kursiv, meine - A.C.) folgendes in Ihrem Controller an

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

Tut es aber nicht! Alles andere scheint in Ordnung zu sein. Authentifizierungsschema, da der Benutzer richtig angemeldet wird und das Cookie .AspNetCore. geschaffen.

Irgendwelche Ideen, warum ein Cookie nach dem Aussagen des Benutzers bleibt?

13

Sie haben nicht genügend Code zum Veröffentlichen veröffentlicht, aber ich habe den Verdacht, dass Sie nach dem Aufruf von SignOutAsync eine Art von Weiterleitung haben (z. B. RedirectToAction), die die Weiterleitung an die OIDC-Endsession-URL überschreibt, die SignOutAsync auszugeben versucht.

(Dieselbe Erklärung für das Umleitungsproblem bei der Weiterleitung ist hier von Microsofts HaoK.)

Edit: Wenn meine obigen Spekulationen korrekt sind, besteht die Lösung darin, eine Weiterleitungs-URL in einem AuthenticationProperties-Objekt mit der endgültigen SignOutAsync zu senden:

// 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

Ich habe das gleiche Problem. SignOutAsync funktioniert nicht wie gewünscht. 

Ich habe das gefunden: 

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

Ich habe das Problem mit dem Löschen meiner Website-Cookies mit dem folgenden Ausschnitt aus meiner Logout () -Methode im Controller behoben. Ich habe festgestellt, dass von meiner Website mehrere Cookies erstellt werden.

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

Und in Startup.cs:

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

Beachten Sie, dass ich await HttpContext.Authentication.SignOutAsync("MyCookieMiddlewareInstance"); nicht verwende, da ich OpenIdConnect mit Google verwende.

2
JTvermose

Hier ist der Code, der den Cookie löscht (Wenn nichts anderes hilft, brutale Gewalt anwenden):

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

Schlecht schlecht schlecht! Scheint wie ein sehr hässlicher Fleck! Aber funktioniert ... :(

Irgendwelche andere Lösungen?

0