Vraag HttpContext.Authentication.SignOutAsync verwijdert geen auth-cookie


Volgens ASP.NET Core documentatie de methode HttpContext.Authentication.SignOutAsync() moet ook de authenticatiecookie verwijderen.

Uitloggen

Om de huidige gebruiker uit te loggen, en verwijder hun cookie (cursivermijn - A.C.) noem het volgende in je controller

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

Maar dat doet het niet! Al het andere lijkt in orde, vooral. auth scheme, omdat de gebruiker correct wordt ingelogd en de cookie .AspNetCore. is gecreëerd.

Om het even welke ideeën waarom koekje overblijft na de sing-out van de gebruiker?


11
2017-12-13 13:13


oorsprong


antwoorden:


Je hebt niet genoeg code gepost om te vertellen, maar ik vermoed dat je belt SignOutAsync je hebt een soort omleiding (bijvoorbeeld RedirectToAction) die de omleiding naar de OIDC-eindtijd-URL overschrijft SignOutAsync probeert uit te geven.

(Dezelfde uitleg voor het redirect-overschrijfprobleem wordt gegeven hier door Microsoft's HaoK.)

Bewerken: als mijn speculatie hierboven correct is, is de oplossing om een ​​omleidings-URL in een te verzenden AuthenticationProperties object met de finale 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);
}

4
2018-01-26 11:34



Ik heb hetzelfde probleem. SignOutAsync werkt niet zoals zou moeten.

Ik vond dit:

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

2
2018-03-24 13:45



Ik heb het probleem opgelost met het verwijderen van mijn sitecookies met het volgende fragment in mijn Logout () -methode in de controller. Ik ontdekte dat er meerdere cookies door mijn site zouden worden aangemaakt.

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

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

Merk op dat ik het niet gebruik await HttpContext.Authentication.SignOutAsync("MyCookieMiddlewareInstance"); sinds ik OpenIdConnect met Google gebruik.


2
2018-03-29 09:09



Hier is de code die de cookie verwijdert (als er niets anders helpt, gebruik dan brute force):

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

Slecht slecht slecht! Het lijkt een heel lelijke patch! Maar werkt ... :(

Ieder anders oplossingen?


0
2017-12-13 13:59