21 messaggi dal 02 ottobre 2012
Buongiorno a tutti,

Sto cercando di sviluppare un'applicazione .NET gestendo i ruoli di appartenenza delle utenze.

Ho abilitato nel web.config roleManager, e ho settato le autorizzazioni per ogni cartella.

come tipo di autenticazione ho scelto il modo Forms, e salvo tutti i dati nei cookie.

Vorrei generare i ruoli all'avvio dell'applicazione, e assegnare dinamicamente (in base al valore trovato nel db) il ruolo ad ogni utente.

Ho provato a modificare la classe RoleProvider, ma senza alcun successo.

Qualcuno può indicarmi la strada da seguire?
Anche con l'utilizzo di variabili di sessione o cookie, se necessario.

Grazie a tutti
383 messaggi dal 23 aprile 2007
posta un po' di codice del RoleProvider customizzato. Al buio è difficile
Ciao
Sergio
21 messaggi dal 02 ottobre 2012
Ciao,

prima di tutto grazie per la risposta!

Allora, ho lasciato da parte la classo RoleProvider, in quanto sto cercando di gestire l'evento Application_AuthenticateRequest nel file global.asax

if (HttpContext.Current.User != null)
   {
     if (Request.IsAuthenticated == true)
     {
      string userInformation = String.Empty;
      string[] roles;
    if ((Request.Cookies["cnstUserRole"] == null) ||(Request.Cookies["cnstUserRole"].Value == ""))
      {
       if (HttpContext.Current.User.Identity.Name == "FINANCE")//in realtà ho passato il ruolo, e non il nome dell'utente
    roles = new string[1] { "FINANCE" };
  else if (HttpContext.Current.User.Identity.Name == "COMMERCIAL")
    roles = new string[1] { "COMMERCIAL" };
      else
    roles = new string[1] { "public" };                   
   //a questo punto mi ciò che mi aspetto è un applicazione nella quale sono stati definiti questi 3 ruoli. Senza database
                     
   userInformation = roles[0] + ";" + Context.User.Identity.Name;
  FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
           1, // version
           User.Identity.Name,             // user name
           DateTime.Now,                   // issue time
           DateTime.Now.AddHours(1),       // expires every hour
           false,                          // don't persist cookie
           userInformation
           );

  String cookieStr = FormsAuthentication.Encrypt(ticket);

       Response.Cookies["cnstUserRole"].Value = cookieStr;
       Response.Cookies["cnstUserRole"].Path = "/";
       Response.Cookies["cnstUserRole"].Expires = DateTime.Now.AddMinutes(1);
                    }
                    else
                    {
      FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Context.Request.Cookies["cnstUserRole"].Value);
                        userInformation = ticket.UserData;
     string[] cookieInfo = userInformation.Split(new char[] { ';' });
     roles = new string[1] { cookieInfo[0] };
          }
           Context.User = new System.Security.Principal.GenericPrincipal(Context.User.Identity, roles);

                }
            }



Questo e' il codice che ho inserito nel global.asax,

Nel web.config, ho dichiarato le cartelle con i permessi di accesso ai ruoli sopra definiti.

nella pagina di login, invece ho inserito questo metodo

System.Web.Security.FormsAuthentication.RedirectFromLoginPage(ruolo, true);

if (Request.QueryString["ReturnUrl"] == null)
Response.Redirect(reader.GetString(4), true);
383 messaggi dal 23 aprile 2007
Personalmente io avrei proseguito lavorando con il roleProvider perchè.. esiste per questo motivo XD, ma se la strada che hai scelto soddisfa le richieste, procedi pure.
ciao
sergio
21 messaggi dal 02 ottobre 2012
Mi sono incartato di nuovo,

roleProvider non deve avere un database di appoggio?


Ad esempio, volendo creare i ruoli:
FINANCE E COMMERCIALE
public override void CreateRole(string roleName)
{
    //dove li salvo? in un array string?
    //verrebbero cancellati ad ogni pageLoad
    //e non avendo i ruoli non potrei assegnare l'utente al ruolo
}

Dove sbaglio?

Grazie,
Andrea
383 messaggi dal 23 aprile 2007
Non necessariamente, credo tu abbia già visto questo esempio di implementazione:
http://msdn.microsoft.com/en-us/library/317sza4k(v=vs.100).aspx
( che utilizza il db) ma, in linea teorica, il Role Provider ha bisogno di due collezioni di valori: la prima per l'elenco dei ruoli e la seconda per le associazioni utente-ruolo. Niente ti impedisce di gestirle in memoria. Se hai un solo server su cui girà l'applicativo l'oggetto HttpApplication sarebbe un buon posto in cui mantenere queste collezioni.

Però, la tua necessità, ora che ho riletto, è quella di creare i ruoli sull'avvio dell'applicazione, quindi perchè non gestire i ruoli da db(esattamnte come avviene nel link su) e sfruttare l'applicationStart del globalAsax per eseguire il fetch iniziale nel db? O anche, credo vada comunque bene, lo stesso metodo initialize del RoleProvider?

Sergio
21 messaggi dal 02 ottobre 2012
Ma dal momento che salvo i dati su un database,(anche localmente, ad esempio, con il db che crea automaticamente lui nella cartella App_Data), questi risulteranno persistenti?

In passato ho gestito la login tramite db, facendo una query che restituiva un ruolo, e quindi reindirizzavo l'utente verso le pagine a lui di competenza.

Ora vorrei mantenere sempre la mia collezione di utenti nelle tabelle del db con una colonna ruolo.
Al momento del login associare (per la durata della sessione/cookie), il ruolo ottenuto, all'utenza.

Vorrei sfruttare le caratteristiche dei ruoli, senza avere un reale db di appoggio.

E' possibile secondo te da gestire a livello di Role Provider?

Grazie
383 messaggi dal 23 aprile 2007
Se i dati sono mantenuti nel db niente ti impedisce di eseguire degli update a tuo piacimento(per aggiornare il ruolo dell'utente) e successivamente rileggerti il dato aggiornato.

In linea puramente teorica ti direi si( ma non oso altro perchè non ho mai avuto a che fare con scenari simili). In fin dei conti Il roleProvider richiede che vengano implementate 3 o 4 metodi, poi da dove vanno a prendere i dati ed in che maniera questo non è importante, l'importante è che i dati restituiti abbiano senso rispetto a ciò che lui si aspetta.

Spero di essere stato sufficientemente chiaro.
Ciao
Sergio

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.