2016-01-21 12 views
5

Possiedo un'applicazione MVC Asp.Net (versione 6.0.0-rc1-final) con ruoli personalizzati e archivi utente. Dopo un po 'di struggling finalmente ho potuto creare un meccanismo di login funzionante. Tuttavia ora ho problemi a creare un logout pulito. Ciò che il mio codice di logout nel controller si presenta attualmente come:Cookie non eliminato dopo il logout con Asp.Net 5 Identity 3.0

public async Task<ActionResult> Logout() 
{ 
    if (User.Identity.IsAuthenticated) 
    { 
    await SignInManager.SignOutAsync(); 

    } 

    return RedirectToAction("Index", "App"); 
} 

Il problema con questo codice è, che un cookie viene cancellato non: .AspNet.Microsoft.AspNet.Identity.Application

Finché poiché non elimino manualmente il cookie, l'applicazione si trova in uno stato di errore e genera eccezioni del puntatore nullo perché User.Identity è nullo.

Ho trovato un question on stackoverflow che descrive uno scenario simile. Ma la soluzione non è appropriata per me perché sto usando MVC 6 che non ha più System.Web.

Ho anche una soluzione di esempio che funziona perfettamente. In questa soluzione il cookie menzionato non viene mai creato. Forse la soluzione giusta è non cancellare il cookie dopo il logout, ma piuttosto impedire in qualche modo la creazione del cookie.

+0

@ Maxisam, hai trovato una soluzione nel frattempo? –

+0

no, ma come ho detto non ha molta importanza. Sembra che non abbia nulla a che fare con i dati di autenticazione. – maxisam

risposta

1

Il problema è che il tuo RedirectToAction sovrascrive il reindirizzamento all'URL del termine di Identity Server a causa di problemi SignOutAsync.

(. La stessa spiegazione per lo stesso problema è dato here da HaoK di Microsoft)

Edit: La soluzione è quello di inviare un URL di reindirizzamento in un oggetto AuthenticationProperties con la 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 IHttpContextAccessor 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); 
} 
+1

Purtroppo non riesco a verificare la tua soluzione perché non sto lavorando più per questo progetto, ma nonostante ciò la tua soluzione mi sembra molto promettente. –

+0

Sì, ho pensato che fossi andato avanti, ma vedo questo problema così spesso che volevo ottenere la risposta per alcuni altri perché è un problema piuttosto complicato. Mi ci sono voluti alcuni giorni per rintracciarlo! – McGuireV10

1

ho potuto risolvere lo stato di sporcizia della mia applicazione dopo la disconnessione da manualmente eliminare il cookie dopo l'azione di logout:

public async Task<ActionResult> Logout() 
{ 
    if (User.Identity.IsAuthenticated) 
    { 
     await SignInManager.SignOutAsync(); 
    } 

    foreach (var key in HttpContext.Request.Cookies.Keys) 
    { 
     HttpContext.Response.Cookies.Append(key, "", new CookieOptions() { Expires = DateTime.Now.AddDays(-1) }); 
    } 
    return RedirectToAction("Index", "App"); 
} 

Poiché i cookie non possono eliminato dal server direttamente Ho appena sovrascrivere i cookie esistenti con un già superato la data di scadenza.

+1

Ho appena scoperto il mio. Il mio problema era che ho eseguito l'override di SignOutAsync in modo errato. Dopo averlo rimosso e usato quello originale. Funziona correttamente ora. – maxisam

+0

@maxisam Puoi approfondire? Sto avendo lo stesso problema anche qui. –

+0

@HaikalNashuha scusa non ricordo cosa fosse ora. Credo che stavo cercando di creare i miei metodi per il server di identità ma ho sovrascritto SignOutAsync in modo errato. – maxisam