Posso condividere i dati tra due utenti in un'applicazione ASP.NET?

-1

Ho un problema con la funzione Roles.IsUserInRole . Ci vuole un sacco di tempo per controllare se l'utente che ha effettuato il login ha un ruolo particolare (tip 3-9 sec). Ho cercato di trovare una soluzione e sono arrivato su questo ma non sono sicuro di averlo pienamente compreso esso.

Quello che ho ottenuto da quanto sopra, viene creata una nuova classe derivata. All'interno di quella classe, c'è una lista che recupera tutti gli utenti contemporaneamente. La prossima volta che controlli IsUserInRole , non utilizzi il metodo IsUserInRole effettivo, ma piuttosto usi quello che hai eseguito l'override nella tua classe. È questa la descrizione corretta? Sono sulla buona strada?

La mia domanda è: i dati possono essere condivisi tra due diversi utenti nell'applicazione ASP.NET? Se sì, i dati condivisi esistono solo se c'è almeno un utente che ha effettuato l'accesso. Se tutti gli utenti si disconnette, che i dati condivisi vengono distrutti? Il mio punto è che questi dati verranno creati una sola volta ogni volta che un utente esegue l'accesso. Per tutti gli utenti successivi possono utilizzare questi dati e controllare i loro ruoli rispetto all'elenco? Ho bisogno di una risposta dettagliata.

La mia applicazione ha utenti e ruoli diversi. Stiamo utilizzando ruoli ASP.NET.

    
posta Noname 09.02.2012 - 06:22
fonte

3 risposte

1

Sì, i dati possono essere condivisi tra due utenti diversi. Ci sono molti modi per farlo, il più veloce e il più sporco sarebbe un campo statico. Altre opzioni includono un DB condiviso, file, ecc.

Per quanto riguarda il problema di velocità, il mio suggerimento sarebbe di creare un fornitore di ruolo che derivi dal tuo attuale fornitore di ruoli. Quindi modificare il provider del ruolo per memorizzare i ruoli dell'utente da qualche parte, probabilmente in [Sessione] [2] la prima volta che tenta di verificare i ruoli dell'utente. Qualsiasi controllo successivo potrebbe colpire la cache e non incorrere nel costo di ottenere i ruoli. A dire il vero probabilmente farei in modo che la cache dei ruoli venga popolata quando l'utente è stato autenticato inizialmente dal momento che l'utente avrà l'aspettativa che l'accesso richiederà un periodo di tempo non previsto quando si richiede solo una pagina.

Risposta aggiornata a causa del commento

Il modo in cui si esegue la memorizzazione nella cache dipende dai requisiti, dalla progettazione e dall'architettura. Quindi, senza specifiche sulla tua implementazione, sarà difficile rispondere alla tua domanda riguardo a come si scadono i ruoli nella cache. Personalmente il mio primo taglio sarebbe quello di fare una cache individuale per ogni utente, motivo per cui ho fatto riferimento alla sessione di cui sopra. Supponendo che lo standard prima questo processo vada qualcosa come

  1. OTTIENI una pagina
  2. REDIRECT alla pagina di accesso
  3. Pagina di accesso POST
  4. REDIRECT alla pagina richiesta originariamente

Potresti essere in grado di popolare in modo asincrono la cache nel passaggio 3 che limiterebbe il ritardo durante l'elaborazione della richiesta dal passaggio 4. Ciò richiederebbe un lavoro di coordinamento che potrebbe ritardare il rendering della pagina nel passaggio 4 se la cache è stata completata ancora.

Una rapida ricerca su google per "WindowsTokenRoleProvider slow" ha rivelato alcuni risultati per gli altri che hanno riscontrato questo problema. Questo articolo descrive almeno una causa e offre una soluzione ragionevole.

    
risposta data 09.02.2012 - 14:52
fonte
1

Come ha detto @Quagmire, sì è possibile condividere i dati tra gli utenti e la scelta migliore sarebbe utilizzare l'ambito applicazione (vedere Come memorizzare i dati nell'ambito dell'applicazione ).

In questo modo, non devi memorizzare nulla.

Tuttavia, ho un commento. Non ne so abbastanza sull'applicazione che stai scrivendo, ma fai attenzione a memorizzare i ruoli degli utenti e non aggiornare mai tali informazioni. Se i ruoli dell'utente cambiano nel tuo database (o nel luogo in cui stai memorizzando queste informazioni), la tua applicazione dovrebbe essere riavviata affinché queste modifiche siano note ... Non molto carina.

Se i ruoli utente non cambiano mai, Application è abbastanza buono. Tuttavia, se cambiano, c'è una soluzione migliore, usa ASP.NET's infrastruttura di caching . È anche possibile definire la scadenza scorrevole e assoluta che rimuoverà efficacemente le informazioni sui ruoli utente dalla cache ad un certo punto.

Ho controllato l' articolo collegato da @KenHenderson, e lui fondamentalmente fa questo tranne che non imposta nessuna scadenza scorrevole / assoluta, il che significa che la cache non viene mai aggiornata.

Quello che vorrei fare è tentare di migliorare la sua bella soluzione impostando un tempo di scadenza di 30 minuti. Dopo trenta minuti senza attività, le informazioni vengono rimosse dalla cache e al successivo collegamento dell'utente all'applicazione, i ruoli utente vengono aggiornati.

    
risposta data 09.02.2012 - 15:55
fonte
-2

Devi implementare il basepage e tutte le pagine devono essere derivate dal baseage.

public class BasePage : System.Web.UI.Page
{

}

public partial class LoginScreen: BasePage
{

}

Oppure puoi usare la variabile di sessione. set

HttpContext.Current.Session["IsUserInRole"] = true;  

get

bool IsUserInRole = Convert.ToBoolean(HttpContext.Current.Session["IsUserInRole"])
    
risposta data 09.02.2012 - 15:18
fonte

Leggi altre domande sui tag