Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 26
  1. #1
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887

    [3.5 - C#] SqlRoleProvider

    Scenario: Visual Studio 2008, applicativo INTRANET con WINDOWS autentication.
    L'utente quindi avrà la nomenclatura DOMINIO\Nomeutente.

    Innanzitutto: è lecito pescare il ruolo da una tabella personalizzata e NON dai ruoli di sistema (power user, admin, etc) trattandosi di Windows Autentication ?

    Se si, come si configura un provider personalizzato per l'accesso a tabelle che non siano quelle di default (aspnet_roles e aspnet_membership) ? In rete ci sono TROPPI esempi.

    [Schema DB di default:
    http://msdn.microsoft.com/en-us/libr...l=en-us%29.gif]

    Grazie

  2. #2
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539
    Ciao,
    premetto col dire che io in asp.net non sono tanto bravo, quindi prendi il mio parere come "un modo per chiaccherare".
    Credo che se usi l'autenticazione di windows, l'unica cosa lecita che ci si può aspettare è di essere coerente con la scelta in tutte gli aspetti che ne conseguono. Quindi secondo me no, credo si debba prendere i ruoli da quelli di sistema.

    Qual'è la tua esigenza?

    Comunque leggendo qua e la credo di aver capito che quando erediti da MembershipProvider nei metodi che sovrascrivi richiami le tabelle che ti pare...


  3. #3
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    Devo eleggere una mia tabella come contenitore dei ruoli, invece che quella di default

  4. #4
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539
    Ciao,

    dovresti creare una classe derivata da "RoleProvider" e fare l'override dei metodi vari, volendo potresti anche non averne db...


    ti faccio un esempio :

    codice:
    public class RoleMaager : RoleProvider
    {
        public override void AddUsersToRoles(string[] usernames, string[] roleNames)
        {
            throw new NotImplementedException();
        }
    
        public override void CreateRole(string roleName)
        {
            throw new NotImplementedException();
        }
    
        public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
        {
            throw new NotImplementedException();
        }
    
        public override string[] GetAllRoles()
        {
            throw new NotImplementedException();
        }
    
        public override string[] GetRolesForUser(string username)
        {
            return new string[] { "Admin" };
        }
    
        public override string[] GetUsersInRole(string roleName)
        {
            throw new NotImplementedException();
        }
    
        public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
        {
            base.Initialize(name, config);
        }
    
        public override bool IsUserInRole(string username, string roleName)
        {
            throw new NotImplementedException();
        }
    
        public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
        {
            throw new NotImplementedException();
        }
    
        public override bool RoleExists(string roleName)
        {
            throw new NotImplementedException();
        }
    
        public override string[] FindUsersInRole(string roleName, string usernameToMatch)
        {
            throw new NotImplementedException();
        }
    
        public override string ApplicationName
        {
            get
            {
                throw new NotImplementedException();
            }
            set
            {
                throw new NotImplementedException();
            }
        }
    }
    nel web.config :

    codice:
    <system.web>
        <authentication mode="Windows" />
        <roleManager enabled="true" defaultProvider="RoleMaager">
          <providers>
            <add name="RoleMaager" type="RoleMaager" connectionStringName="DatabaseEntities" />
          </providers>
        </roleManager>
    nella pagina :

    codice:
    [PrincipalPermission(SecurityAction.Demand, Role = "Admin")]
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Roles.GetAllRoles();
        }
    }
    in questo scenario, prima di tutto viene chiamato (alla compilazione...) il metodo Initialize, dalla quale ottengo le varie informazioni in forma di key valore (da config) e il nome dell'applicazione, qui posso impostare ad esempio la connessione ad un db, successivamente, siccome ho utilizzato l'attributo "[PrincipalPermission(SecurityAction.Demand, Role = "Admin")]" nella pagina chiamata, viene chiamato GetRolesForUser, che mi passa il nome utente (in questo caso quello di windows) a questo punto, dentro il metodo potrei confrontarlo anche con un file di testo, o addirittura come ho fatto nell'esempio (ma solo come esempio!) dare a tutti il ruolo "Admin" (ma avrei potuto usare anche lavaCessi! bansta che nell'attributo lo impostavo così per accedere), quindi avendo avuto l'accesso alla pagina, nel load chiedo tutti i ruoli, chiamando così il metodo GetAllRoles (che non ho implementato), li avrei potuto restituire tutti i ruoli che volevo, e così via anche per gli altri metodi.

    Ovviamente ho fatto qualche prova giusto così, quindi non sono esperto nel campo, ma se hai bisogno di una mano, prova a chiedere, magari riesco a dartela.


  5. #5
    Ciao,
    il suggerimento di U235 è giusto,
    dovresti crearti una tua classe che effettua l'override del Provider.

  6. #6
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    Grazie mille. Ho chiamato la nuova classe doRoleProvider.
    Domanda banale: dove, precisamente gli dico di usare una mia stringa di connessione ?

    (Il mio web.config ora:
    codice:
    <connectionStrings>
    		<add name="MyConn" connectionString="Data Source=etc..."/>
    </connectionStrings>
    
    <authentication mode="Windows" />
            
    <roleManager enabled="true" defaultProvider="doRoleProvider">
         <providers>
              <add name="doRoleProvider" type="doRoleProvider" connectionStringName="DatabaseEntities" />
        </providers>
    </roleManager>
    )

    qui...

    codice:
    public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
    {
         base.Initialize(name, config);
    }
    ...oppure dando il valore alla proprieta' connectionStringName del provider aggiunto ?

  7. #7
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539
    Ciao, in realtà, "config" ti restituisce i nomi del parametro che imposti nel web.config, ad esempio, se io nel config imposto dei parametri del genere :

    codice:
    <add name="doRoleProvider" type="doRoleProvider" connectionStringName="DatabaseEntities" NumeroCaretteriMinPassword="20" />
    otterrò dal config (del Initialize) le keys "connectionStringName" e "NumeroCaretteriMinPassword", che con un ToString() traduco in valore (DatabaseEntities, 20), a questo punto, la connessione ad esempio, posso impostarla passando nel parametro "connectionStringName" il nome della connessione del config oppure direttamente la stringa di connessione, dipende da come preferisci fare.

    I parametri del config li stabilisci tu nel config stesso, e li recuperi nella classe, secondo quello che ti aspetti tu, sei libero di scegliere. Questo perchè ovviamente si tratta di un provider completamente personalizzato, quindi anche i suoi parametri lo sono. Un utente esterno che usa la tua classe deve conoscere solo i nomi dei parametri che tu aspetti nella classe, e il valore che devono avere, sempre secondo la tua logica.


  8. #8
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    Si, config è una System.Collections.Specialized.NameValueCollection , guardando meglio ho visto il tipo.

    Grazie mille, funziona perfettamente, ti sarò eternamente grato per avermi risparmiato la lettura di 856732 articoli o dell'intero capitolo del manuale

    Unico dubbio, decorare la classe con:
    codice:
    [PrincipalPermission(SecurityAction.Demand, Role = "Admin")]
    non è strettamente legato alla chiamata del metodo GetRolesForUser, vero ? (anche se non l'ho fatto, il metodo viene chiamato lo stesso, per la dinamica del Role Manager)

    A cosa serve esattamente ?

  9. #9
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539
    Originariamente inviato da djciko
    Si, config è una System.Collections.Specialized.NameValueCollection , guardando meglio ho visto il tipo.

    Grazie mille, funziona perfettamente, ti sarò eternamente grato per avermi risparmiato la lettura di 856732 articoli o dell'intero capitolo del manuale

    Unico dubbio, decorare la classe con:
    codice:
    [PrincipalPermission(SecurityAction.Demand, Role = "Admin")]
    non è strettamente legato alla chiamata del metodo GetRolesForUser, vero ? (anche se non l'ho fatto, il metodo viene chiamato lo stesso, per la dinamica del Role Manager)

    A cosa serve esattamente ?
    Figurati

    Si, lo è, è legata nel senso che io l'ho utilizzato in una pagina nella root (quindi root accessibile a tutti, ma anche quando è autenticata in maniera specifica quindi accessibile solo a quell'utente), quando chiamata, prima di tutto fa una chiamata alla RoleManager nel metodo GetRolesForUser passandomi il dominio\utente nel parametro "username", di conseguenza, anche se autorizzato nel config per quella cartella, mi da un errore di protezione (solo per quella pagina) nel caso l'utente tra i ruoli restituiti non contenga quella dicitura ("Admin").


  10. #10
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539
    Originariamente inviato da djciko
    ...per avermi risparmiato la lettura di 856732 articoli o dell'intero capitolo del manuale ...
    In realtà probabilmente ne sai più tu di me, almeno sull'argomento, io mica mi sono letto gli articoli o il capitolo, ho solo fatto un parse delle parole ":RoleProvider"; "config"; "<roleManager "; "Type= " ed è venuta fuori quella roba li

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.