2016-03-25 7 views
11

Sto lavorando su una funzione di disconnessione nell'applicazione che stiamo utilizzando accesso Identità ASP.NET. Posso entrare con successo ma quando ho il logout e quindi provare a effettuare nuovamente il login ricevo il seguente messaggio:Il token anti-contraffazione era destinato a un utente diverso basato sulle attestazioni

The provided anti-forgery token was meant for a different claims-based user than the current user. 

Ecco il mio codice di logout:

public ActionResult Logout() 
     { 
      SignInManager.Logout(); 
      return View("Index"); 
     } 

**SignInManager.cs** 
public void Logout() 
     { 
      AuthenticationManager.SignOut(); 
     } 

Dopo l'utente preme il pulsante di disconnessione è portato alla schermata di accesso. L'url dice ancora "http://localhost:8544/Login/Logout". Dal momento che siamo nella schermata di accesso forse dovrebbe solo dire "http://localhost:8544/Login".

+0

Penso che puoi farlo funzionare utilizzando un reindirizzamento nella tua azione di disconnessione, invece di restituire la vista direttamente. 'return RedirectToAction (" Index ");' Questo è auspicabile che imposti correttamente tutte le intestazioni e le informazioni sui cookie. – Silvermind

risposta

2

Prova questa:

public ActionResult Logout() 
{ 
    AuthenticationManager.SignOut(); 
    Session.Abandon(); 
    return RedirectToAction("Index"); 
} 

Che sarà ricaricata la pagina di accesso, che vi fornirà un nuovo token CSRF.

+3

asp.net auth non è collegato alla sessione in alcun modo :) – blowdart

11

Si sta restituendo un View anziché chiamare RedirectToAction(). Quindi, ciò che sta accadendo è che la vista è in esecuzione nel contesto della richiesta di disconnessione, in cui l'utente è ancora loggato. Non verranno disconnessi fino al termine della richiesta.

Quindi, cercare

public ActionResult Logout() 
{ 
    SignInManager.Logout(); 
    return RedirectToAction("Index", "Home"); 
} 
+0

Ho lo stesso problema. Utilizzo di openidconnect e autenticazione basata su token. Memorizzare il token xsref nei cookie come predefinito. Ho visto che il token è tornato alla richiesta di post API, ma fallendo con 400 errore dicendo (Il token antiforgery fornito era pensato per un utente basato sulle attestazioni diverso dall'utente corrente). Ho provato a sostituire ValidateAntiforgeryToken con AutoValidateAntiforgeryToken. Anche provato a cambiare l'ordine di app.UseAuthentication(); e app.UseXsrf() ;, ma nessun problema. Sono bloccato, non ho idea di quale affermazione di errore stia parlando. – Nexus23

3

Ciò che ha funzionato per me è stata la commutazione dell'ordine dei middleware utilizzati. Aggiungi prima app.UseAuthentication() e poi la roba antiforgia. Ecco come ho fatto:

app.UseAuthentication(); 
app.Use(next => ctx => 
     { 
      var tokens = antiforgery.GetAndStoreTokens(ctx); 

      ctx.Response.Cookies.Append("XSRF-TOKEN", tokens.RequestToken, 
       new CookieOptions() { HttpOnly = false }); 

      return next(ctx); 
}); 

Facendo il contrario crea un token che non è destinato per gli utenti autenticati.