2009-02-12 15 views
7

Come si risolve il problema del ciclo di accesso infinito quando si utilizzano sessioni senza cookie e non è possibile modificare il nome di login.aspx in un httphandler?Form di login autenticazione Asp.net loop

vale a dire quando un utente con privilegi di amministratore preme il pulsante di logout e l'url ritorno ad una pagina riservata è passato a Login.aspx poi un altro utente senza privilegi di amministratore tenta di eseguire il login ottengono reindirizzato alla pagina di login.

Mi sono imbattuto in questo solution ma non riesco a cambiare il nome di login.aspx in un gestore http e la funzione di autenticazione non sembra funzionare nella pagina di aspx con auth senza cookie perché il ticket di autenticazione moduli sembra essere rimosso dall'URL quando viene reindirizzato alla pagina di accesso.

EDIT:

Poiché questa applicazione è già in produzione non può alterare il flusso pagina del/logout processo di login/timeout o rinominare la pagina di login.

+1

questa è una domanda dannatamente buona – StevenMcD

+0

Sono d'accordo con gli altri in un aspetto: come si può risolvere questo se non è possibile modificare nulla? Stai cercando una soluzione solo modificando il file web.config e nient'altro? Veramente non penso sia possibile – juan

risposta

2

Verificare se l'utente è autorizzato ad accedere alla pagina in returnUrl, dopo aver effettuato l'accesso nella pagina login.aspx. Si potrebbe utilizzare questo metodo del UrlAuthorizationModule (o uno personalizzato se funziona meglio per voi):

System.Web.Security.UrlAuthorizationModule.CheckUrlAccessForPrincipal(

    returnUrl, 
    userPrincipal, 
    GET"); 

Se l'utente non è autorizzato, solo reindirizzare a una pagina che l'utente può accedere.

Per ottenere l'utente principale:

var roles = System.Web.Security.Roles.GetRolesForUser(username); 

var principal = new System.Security.Principal.GenericPrincipal(

    new System.Security.Principal.GenericIdentity(username), 

    roles 

); 
+0

Ciao Freddy, questa è una buona idea, eccetto che non penso che tu possa accedere ad un oggetto genericprincipal autenticato finché il ticket form non è stato inserito nell'URL. Come ottenere l'oggetto principale autenticato nella pagina di accesso? – Element

+0

Ho fatto una modifica e ho aggiunto il codice di esempio per ottenere GenericIdentity. – eglasius

+0

Funziona sicuramente, come è andata? – eglasius

0

È possibile modificare il flusso della pagina?

Ciò che intendo è, piuttosto che reindirizzare nuovamente alla pagina login.aspx quando un utente non ha accesso a una risorsa, reindirizzandoli a una pagina di informazioni.

Questa pagina spiega le ragioni del redirect, e dà loro opzioni come:

1. Click here to login as another user. 
2. Click here to request access to the page. 
3. Click here to login again, if your session has expired. 

Ciò rimuovere il riferimento circolare, e quindi il problema.

+0

Purtroppo l'applicazione è già in produzione e non posso modificare la procedura di login, ho davvero bisogno che sia trasparente. – Element

+1

Penso che potresti dover apportare una modifica più fondamentale all'applicazione. Non sei in grado di rilasciare una nuova versione di questo con il problema risolto (cioè utilizzando la soluzione httphandler)? – Charlie

1

Alcune opzioni ...

One, reindirizzare torna manualmente per Login.aspx quando un utente è disconnesso, quindi non c'è ReturnURL. Avere un meta-refresh sulle pagine che corrisponde al timeout della sessione in modo che l'utente non faccia clic sulle risorse a cui improvvisamente non è possibile accedere.

Due, registrare sempre qualcuno nella pagina di accesso di Login.aspx. Ehi, perché no? Posso pensare ad alcune ragioni, ma forse non si applicano alla tua situazione.

Tre, ignorare ReturnURL. Non devi chiamare RedirectFromLoginPage! Reindirizza l'utente a una pagina di destinazione predefinita all'accesso.

1

Abbiamo avuto un problema simile, e mi è stato risolto nel seguente modo:

If "LogOut".Equals(e.CommandName) Then 
    FormsAuthentication.SignOut() 
    Response.Redirect("~/Login.aspx") 
End If 

E poi in Login.aspx cambiamo il PostBackUrl per Login.aspx se contiene un parametro ReturnUrl che invia all'utente indietro su Login.aspx.

+0

Ciao Leandro, questo è un buon suggerimento eccetto che funzionerà solo quando un utente fa clic sul pulsante Logout, se la sessione degli utenti scade, passerà comunque l'URL corrente come parametro returnurl. – Element

+0

Quindi, di nuovo, rimuovere il parametro ReturnUrl nell'URL di postback del modulo Login.aspx se ReturnUrl contiene Login.aspx. –

0

Che dire l'aggiunta di un modulo HTTP che controlla se l'Request.UrlReferrer è la pagina di login e in tal caso i controlli se sono autorizzati ad accedere al Request.Url e se non li reindirizza a "Non sei autorizzato a visualizzare questa pagina". pagina.

0

Sebbene si affermi che non è possibile modificare il nome di login.aspx in un gestore HTTP, si è tentato di aggiungere un reindirizzamento HTTP 301 in modo tale che ogni volta che viene richiesto login.aspx, il server reindirizza l'utente a un gestore HTTP, ad es. login.ashx?

Problemi correlati