2009-04-14 10 views
15

Esiste un modo per modificare dinamicamente LoginUrl di FormsAuthentication? Quello che ho è tutto il sito protetto da FormsAuth, ma per alcune pagine in una sottocartella, vorrei portare l'utente a una pagina di login diversa e avere FormsAuth per gestire la roba di ReturnUrl. È possibile o devo scrivere il mio codice di reindirizzamento per i casi di sottocartelle?Come sovrascrivere/modificare FormsAuthentication LoginUrl in alcuni casi

Ecco un esempio di layout:

~/LogOn1.aspx 
    ~/Protected1.aspx 
    ~/Protected2.aspx 
    ~/Subfolder/ 
    ~/Subfolder/LogOn2.aspx 
    ~/Subfolder/NotProtected.aspx 
    ~/Subfolder/Protected3.aspx 

Quindi il mio web.config assomiglia:

<forms loginUrl="~/Splash.aspx" ... /> 

Tutte le pagine aspx * protette hanno

<deny users="?"> 

Cosa Sono d come se, è per ~/Sottocartella/Protected3.aspx da reindirizzare a ~/Sottocartella/LogOn2.aspx se l'utente è anonimo.

ho provato mettendo una versione ridotta del web.config in ~/sottocartella/web.config:

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
     <authentication mode="Forms"> 
     <forms loginUrl="~/Subfolder/LogOn.aspx" name="SiteAuth" protection="All" timeout="30" path="/" defaultUrl="~/Subfolder/default.aspx" requireSSL="true" cookieless="UseCookies" enableCrossAppRedirects="false" /> 
     </authentication> 
     <authorization> 
     <deny users="?" /> 
     </authorization> 
    </system.web> 
</configuration> 

Ma tutto ciò che mi viene è questo errore:

It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS.

penso rendere la sottocartella dir a un'applicazione potrebbe causare ancora più problemi a questo punto, ma forse ho torto. Se si trattasse di un'applicazione, non separerebbe tutto il codice in ~/Sottocartella dal resto dell'app padre?

+0

Quando si dice dinamicamente, si desidera che solo alcune pagine della sottocartella vengano reindirizzate al loginurl in determinati momenti? O vuoi tutte le pagine in una sottocartella per reindirizzare a un loginurl tutto il tempo? – rahkim

+0

Ho alcune pagine nella sottocartella che consentono l'accesso anonimo, quindi non è necessario reindirizzare. Ma le pagine nella sottocartella che hanno deny = "?" Mi piacerebbe reindirizzato a ~/sottocartella/LogOn.aspx, dove il resto delle pagine protette del sito al di fuori della sottocartella viene reindirizzato a ~/LogOn.aspx. – slolife

+0

Il link è di aiuto? – rahkim

risposta

10

Il problema che stai avendo è che il Forms element è consentito solo a livello di applicazione - non è possibile definire in un sub- web.config.

Sfortunatamente non è possibile definirlo utilizzando Location element e la proprietà FormsAuthentication.LoginUrl è di sola lettura.

A caccia di un po ', sembra che la soluzione migliore sarebbe avere un codice sulla tua pagina di login che rilevi da dove è arrivato l'utente (cioè controllando il valore della stringa di query "ReturnUrl") e reindirizzarlo a la tua altra pagina di accesso se provengono dalla sottodirectory. Tuttavia, ammetto che questo non si adatta bene se si desiderano pagine di login personalizzate per più sottodirectory. :(


In repsonse per la tua modifica - sì, rendendo la sottocartella un'applicazione avrebbe "risolvere" questo errore, ma come fai notare, avresti allora hai più problemi, come avresti bisogno per spostare tutti i binari rilevanti, app_code, cosa hai in quella sottocartella, quindi non è proprio una soluzione

5

Ciascuna sottocartella consente di disporre di un file webconfig separato. Così si potrebbe mettere un web.config nel vostro sottocartella con i tag:

<authentication mode="Forms"> 
    <forms loginUrl="~/Subfolder/LogOn2.aspx" /> 
</authentication> 
+2

Errore che ottengo quando inserisco il file web.config ridotto nella sottocartella: È un errore usare una sezione registrata come allowDefinition = 'MachineToApplication' oltre il livello di applicazione. Questo errore può essere causato da una directory virtuale non configurata come un'applicazione in IIS. – slolife

+0

Oh ... avrei dovuto essere più chiaro. Dovresti inserire un web.config nella sottocartella, assicurati di includere il tag per l'autenticazione. – rahkim

+0

Ecco un esempio di utilizzo di più configurazioni: http://www.codeproject.com/KB/aspnet/multipleWebConfig.aspx – rahkim

7

Ho avuto questo problema e ho cercato su Google solo qui per cercare di risolverlo, poi mi sono ricordato di averlo fatto molto tempo fa e quello che ho fatto è stato nella pagina login.aspx predefinita nella cartella root nell'evento Page_Load Ho fatto un reindirizzamento basato sull'URL di ritorno alla mia sottocartella di gestione e alla sua pagina login.aspx! Dovresti ripetere il bit pertinente per ogni sottodirectory.

public void Page_Load(object sender, EventArgs e) 
{ 
//check for existence of ReturnUrl in QueryString  
    //if it contains manage redirect to manage login page 
    if (!String.IsNullOrEmpty(Request.QueryString["ReturnUrl"])) 
    { 
     if (Request.QueryString["ReturnUrl"].Contains("manage")) 
     { 
      Response.Redirect("manage/login.aspx"); 

     } 
    } 
} 
+0

Ottima risposta, risolto il mio problema! L'unica cosa che vorrei aggiungere è che il web.config dovrebbe ovviamente consentire agli utenti di accedere alle pagine di accesso delle sottodirectory in modo da non ottenere un reindirizzamento ricorsivo tra la pagina di accesso di base e la pagina di accesso alla sottodirectory. –

Problemi correlati