Contesto.L'utente perde i ruoli dopo essere stato assegnato in Global.asax.Application_AuthenticateRequest

StackOverflow https://stackoverflow.com/questions/56271

Domanda

Sto utilizzando l'autenticazione basata su moduli nella mia applicazione asp.net (3.5).Utilizzo anche i ruoli per definire quale utente può accedere a quali sottodirectory dell'app.Pertanto, le sezioni pertinenti del mio file web.config assomigliano a queste:

<system.web>
  <authentication mode="Forms">
    <forms loginUrl="Default.aspx" path="/" protection="All" timeout="360" name="MyAppName" cookieless="UseCookies"  />      
  </authentication>
  <authorization >
    <allow users="*"/>
  </authorization>
</system.web>

<location path="Admin">
  <system.web>
    <authorization>
      <allow roles="Admin"/>
      <deny users="*"/>
    </authorization>
  </system.web>
</location>

In base a ciò che ho letto, ciò dovrebbe garantire che gli unici utenti in grado di accedere alla directory di amministrazione saranno gli utenti che sono stati autenticati e a cui è stato assegnato il ruolo di amministratore.

L'autenticazione dell'utente, il salvataggio del ticket di autenticazione e altri problemi correlati funzionano tutti correttamente.Se rimuovo i tag dal file web.config, tutto funziona correttamente.Il problema sorge quando provo a imporre che solo gli utenti con il ruolo di amministratore possano accedere alla directory di amministrazione.

Basato su questo Articolo della Microsoft Knowledge Base insieme ad altre pagine web che forniscono le stesse informazioni, ho aggiunto il seguente codice al mio file Global.asax:

protected void Application_AuthenticateRequest(Object sender, EventArgs e) {
    if (HttpContext.Current.User != null) {
        if (Request.IsAuthenticated == true) {    
            // Debug#1            
            FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Context.Request.Cookies[FormsAuthentication.FormsCookieName].Value);
            // In this case, ticket.UserData = "Admin"                
            string[] roles = new string[1] { ticket.UserData }; 
            FormsIdentity id = new FormsIdentity(ticket);
            Context.User = new System.Security.Principal.GenericPrincipal(id, roles);
            // Debug#2
        }
    }
}

Tuttavia, quando provo ad accedere, non riesco ad accedere alla cartella Admin (vengo reindirizzato alla pagina di accesso).

Cercando di eseguire il debug del problema, se eseguo una richiesta, se eseguo Context.User.IsInRole("Admin") nella riga contrassegnata sopra Debug#1, restituisce un false.Se eseguo la stessa istruzione alla riga Debug#2, è uguale a true.Quindi, almeno per quanto riguarda Global.asax, il ruolo viene assegnato correttamente.

Dopo Global.asax, l'esecuzione passa direttamente alla pagina di accesso (poiché la mancanza di ruolo fa sì che il caricamento della pagina nella cartella admin venga rifiutato).Tuttavia, quando eseguo la stessa istruzione sulla prima riga di Page_Load del login, restituisce false.Pertanto, da qualche parte dopo Application_AuthenticateRequest in Global.asax e il caricamento iniziale del WebForm nella directory riservata, le informazioni sul ruolo vengono perse, causando il fallimento dell'autenticazione (nota:in Page_Load, il ticket di autenticazione corretto è ancora assegnato a Context.User.Id - solo il ruolo viene perso).

Cosa sto facendo di sbagliato e come posso farlo funzionare correttamente?


Aggiornamento:Ho inserito il soluzione qui sotto

È stato utile?

Soluzione

Ecco il problema e la soluzione:

All'inizio dello sviluppo ero andato nel menu Sito Web e avevo fatto clic su Configurazione Asp.net.Ciò ha comportato l'aggiunta della seguente riga a web.config:

<system.web>
  <roleManager enabled="true" />
</system.web>

Da quel momento in poi, l'app presupponeva che stavo svolgendo i ruoli tramite il gestore del sito Asp.net e non tramite i ruoli FormsAuthentication.Da qui i ripetuti fallimenti, nonostante il fatto che l'autenticazione effettiva e la logica dei ruoli fossero impostati correttamente.

Dopo che questa riga è stata rimossa da web.config, tutto ha funzionato perfettamente.

Altri suggerimenti

questo è solo uno scatto casuale, ma vieni bloccato a causa dell'ordine di autorizzazione per l'amministratore?Forse dovresti provare a cambiare il tuo Nega tutto e il tuo Tutto Amministratore.

Nel caso in cui venga sovrascritto dal rifiuto.

(Avevo degli esempi di codice qui ma non venivano visualizzati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top