2016-12-13 4 views
9

Laut ASP.NET Core documentation muss die Methode HttpContext.Authentication.SignOutAsync() das Authentifizierungs-Cookie ebenfalls löschen.HttpContext.Authentication.SignOutAsync löscht das Authentifizierungs-Cookie nicht

Abmelden

Um den aktuellen Benutzer abzumelden, und löschen ihre Cookies (Hervorhebungen von mir - AC) in Ihrem Controller die folgenden nennen

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

Aber das tut es nicht! Alles andere scheint in Ordnung, vor allem. Authentifizierungsschema, weil der Benutzer korrekt angemeldet wird und der Cookie .AspNetCore. geschaffen.

Irgendwelche Ideen, warum Cookie nach dem Aussprechen des Benutzers bleibt?

+0

ist das noch heute relevant? – Proviste

+1

Docs leicht geändert - anstelle von "MyCookieMiddlewareInstance" sagen sie CookieAuthenticationDefaults.AuthenticationScheme, die offensichtlich nicht das Gleiche ist. Wenn der Code jedoch den Cookie löscht, ist das etwas, was Sie selbst leicht überprüfen können.Schließlich wird dies in AccountController aufgerufen (LogOff-Methode vorausgesetzt, Sie haben die Authentifizierung beim Scaffolding Ihrer App aktiviert. –

Antwort

0

Hier ist der Code, der das Cookie löscht (Wenn nichts anderes hilft, benutzen 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); 
} 

Bad, schlecht, schlecht! Scheint wie ein sehr hässlicher Patch! Aber funktioniert ... :(

Alle andere Lösungen

2

ich das gleiche Problem haben SignOutAsync funktioniert nicht wie sollte

Ich fand diese:..

+0

Wo? Im Quellcode oder anderswo (Blog, Antwort, etc.)? Und magische Strings sind trotz des kürzeren Codes wirklich eklig. –

2

Ich löste das Problem mit dem Löschen meiner Website-Cookies mit dem folgenden Ausschnitt in meiner Logout() -Methode in der Steuerung.Ich fand, dass mehrere Cookies würde von meiner Seite 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 nicht await HttpContext.Authentication.SignOutAsync("MyCookieMiddlewareInstance"); verwenden, da ich mit Google verwenden OpenIdConnect.

+0

Ich schätze, dass nur ein einziger Cookie (der Auth) gelöscht werden muss.Löschen aller Cookies von Ihrer Website platziert scheint eine sehr rohe Kraft und möglicherweise unerwünscht, obwohl es funktionieren kann.Und Löschen eines einzigen Cookie scheint wie eine Lösung bereits von Castro vorgeschlagen JR, siehst du einen Unterschied? Danke trotzdem. –

2

Sie schreiben nicht genug Code zu sagen, aber ich vermute, nachdem Sie rufen SignOutAsync Sie haben irgendeine Art von Redirect (zB RedirectToAction), die die Umleitung auf die OIDC EndSession URL überschreibt, dass SignOutAsync versucht Ausgabe zu.

(Die gleiche Erklärung für die Umleitung überschreibt Problem wird here von Microsofts Haok gegeben.)

Edit: Wenn meine Spekulation über richtig ist, ist die Lösung eine Redirect-URL in einem AuthenticationProperties Objekt mit den endgültigen SignOutAsync 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); 
} 
Verwandte Themen