2012-11-30 3 views
6

Sto utilizzando SimpleMembership nel mio progetto .NET MVC4. Durante lo sviluppo, mentre manipolo/ricostruisco manualmente il database, mi sono imbattuto in un errore che sarebbe improbabile in produzione, ma voglio risolverlo e non riesco a trovare un modo elegante per gestirlo..NET MVC4 Errore SimpleMembership - "Non è stato trovato nessun utente che abbia il nome xxx"

Se, dopo aver effettuato l'accesso all'applicazione, il nome utente viene modificato nel database o il record utente completamente cancellato, l'utente non sarà più in grado di accedere a nessuna pagina dell'applicazione ... comprese le pagine pubbliche che consentono viste anonime e la schermata di accesso. Invece, viene lanciata un'eccezione: "Non è stato trovato nessun utente che abbia il nome 'nome utente'".

Tutte le pagine dell'applicazione visualizzano una vista parziale che esegue il rendering di un controllo di accesso/disconnessione. Request.IsAuthenticated restituisce true indipendentemente da cosa c'è nel database. Sembra che l'app ritenga che l'utente abbia ancora effettuato l'accesso in base alle informazioni contenute nel cookie, ma non è possibile trovare record corrispondenti nel database. Cancellare il cookie auth risolve questo problema, ma non è un'istruzione che vorrei fornire a un utente che potrebbe averlo riscontrato.

La mia soluzione attuale è quella di rilevare tale eccezione nel Global.asax, cancellare i cookie e reindirizzare alla pagina di accesso. Questo mi sembra completamente intrusivo.

Qualcuno ha trovato una soluzione migliore a questo scenario? Non ho mai riscontrato problemi come questo utilizzando il vecchio provider di appartenenza .NET ... la mia aspettativa è che questa situazione dovrebbe essere coperta immediatamente e non dovrei doverne fare conto ... se un record viene modificato/cancellato nel DB, l'utente dovrebbe fallire l'autorizzazione e essere reindirizzato automaticamente alla pagina di login.

risposta

1

Si può controllare la cache del db o da qualche parte la pagina, dopo l'accesso, dipendenza del record utente, dove è dipendente, catena di eliminazione o potrebbe verificarsi a causa dell'iniezione dipendenza.

prega di esso o si prega di condividere il codice ..

-1

Questo sembra essere causato quando si passa da voi Dev ambiente ad un altro ospite. L'host locale sta ricordando il cookie di accesso e sta tentando di usarlo contro il nuovo semplice database di appartenenza.

Come hai detto, non succede in produzione. Spiacente, non conosco un modo migliore per utilizzare lo stesso login su entrambi i database locali e di produzione.

+0

Beh immagino ancora accadrebbe in produzione, tutto quello che intendevo era che probabilmente non sarebbe successo perché in una situazione di produzione non avrei cancellato manualmente i record nel database. Non si tratta di cambiare host. Non ho passato molto tempo a cercare di capire come superare questo problema, ma fondamentalmente ha a che fare con un cookie di autenticazione nel mio browser che fa riferimento a un utente che non esiste più nel database ... Vorrei solo che questo fosse gestito più elegantemente fuori dalla scatola. – Gadget27

1

Non sai da dove avete la vostra logica di autenticazione prima, ma qui è quello che faccio:

In Global.asax.cs:

protected void Application_Error(object sender, EventArgs e) 
    { 
     Exception ex = Server.GetLastError(); 

     if (ex.Message.Contains("No user found was found that has the name")) 
     { 
      FormsAuthentication.SignOut(); 
      Response.Redirect(Request.RawUrl); 
     } 
    } 

Dal momento che l'eccezione generata è solo un System.InvalidOperationException, non v'è non puoi farci molto. Non molto intelligente, ma fa ciò che deve essere fatto. Inoltre, assicurarsi che sulla pagina che stai reindirizzando per non v'è alcuna logica di autenticazione come IsUserInRole(...), se sì, allora si potrebbe desiderare di avvolgerlo in try{} catch(){}

1

ho avuto lo stesso tipo di problema, IsAuthenticated tornando true mentre ero non registrato nel sito MVC 4, con conseguente messaggio di errore. Nella nostra soluzione avevo due siti MVC 4 con SimpleMembership e si è scoperto che ero loggato al primo sito mentre eseguivo il debug del secondo sito. Penso che avrà a che fare con il cookie che viene impostato mentre entrambi i siti vengono eseguiti con una porta diversa su localhost in modo che entrambi imposti lo stesso cookie di autenticazione.Probabilmente dovrò cambiare il modo in cui verrà impostato il cookie di autenticazione.

Penso che potresti avere un problema diverso, ma forse la mia "soluzione" può aiutare qualcuno che ha questo problema.

+1

Questa soluzione ha funzionato per me, ero connesso da un altro sito e quando ho cambiato sito mi stava dando questo errore. Basta cancellare la cache/i cookie, funzionerà correttamente. –

0

Override AuthorizeAttribute:

public sealed class AuthorizeAttribute : System.Web.Http.AuthorizeAttribute 
{ 
    protected override bool IsAuthorized(HttpActionContext actionContext) 
    { 
    try 
    { 
     return base.IsAuthorized(actionContext); 
    } 
    catch 
    { 
     return false; // user name from cookie is no longer in db 
    } 
    } 

    protected override void HandleUnauthorizedRequest(HttpActionContext actionContext) 
    { 
    // handle this exception by global exception filter for redirection to login 
    throw new CustomAuthException(); 
    } 
} 
0

ho aggiunto alla risposta Arman Bimatov in modo che registro che si è davanti a voi il reindirizzamento alla pagina corrente. E reindirizzandoti alla pagina corrente, returnURL verrà posizionato correttamente nella stringa di query.

In Global.asax.cs:

 
protected void Application_Error(object sender, EventArgs e) 
    { 
     Exception ex = Server.GetLastError(); 

     if (ex.Message.Contains("No user found was found that has the name")) 
     { 
     FormsAuthentication.SignOut(); 
     Response.Redirect(Request.RawUrl); 
     } 
    } 

Tuttavia, questo non funzionerà a meno che non si dispone di una sezione CustomerErrors nel web.config come da questa domanda: global.asax Application_Error not firing

+0

http://stackoverflow.com/questions/3713939/global-asax-application-error-not-firing –