Autenticazione (continuazione)

martedì 02 dicembre 2008 - 17.19

bolla111 Profilo | Senior Member

ciao
nel'ultimo mio thread chiedevo un aiuto x l'autenticazione di tipo form...(il thread risale a venerdì 28)
ora ho un'ulteriore richiesta...devo aggiungere i ruoli...qlcn può aiutarmi?
x marco rossi: sto leggendo il tuo articolo sull'autenticazione form...e faccio un po di fatica...mi puoi dare una dritta?
grazie

gae58 Profilo | Senior Member

qual' è il problema sui ruoli?


Gaetano

bolla111 Profilo | Senior Member

non capisco bene come impostarli x ciascun utente (nel mio caso sono raccolti in una tabella di database sql server)...

rossimarko Profilo | Guru

Ciao,

alla fine come hai gestito l'autenticazione? Con i provider o utilizzando i metodi delle windowsforms?

Per i ruoli la cosa importate è caricare da database l'elenco dei ruoli associati ad un utente, e poi specificarlo all'interno della collection dei ruoli o nel RoleProvider..
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

bolla111 Profilo | Senior Member

niente semplicemente come avevo postato nell'altro thread...ho permesso l'accesso a tutti gli utenti che erano presenti nella tabella di db
ora però vorrei provare a impostare x un utente il ruolo di amministratore mentre x altri registrati il ruolo di utente...

rossimarko Profilo | Guru

Se non usi i provider devi gestire il metodo AutenticateRequest del global.asax come riportato in questo articolo: http://support.microsoft.com/kb/311495

In pratica viene impostata la nuova identity associando i ruoli all'utente loggato:
HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(id,myRoles)

I ruoli ovviamente saranno quelli che hai caricato da database
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

bolla111 Profilo | Senior Member

quindi prima di tutto devo assegnare un ruolo a ogni utente già nella tabella di db;
mi conviene usare una tabella a parte come nel tuo articolo o creo solo un campo in + nella mia tabella utenti?
poi do un'occhiata a quel link...

rossimarko Profilo | Guru

>quindi prima di tutto devo assegnare un ruolo a ogni utente già
>nella tabella di db;
>mi conviene usare una tabella a parte come nel tuo articolo o
>creo solo un campo in + nella mia tabella utenti?
>poi do un'occhiata a quel link...
>
>

Si devi avere i dati già pronti su database.

Ti consiglio di normalizzare il db, quindi una tabella con i ruoli e poi:
- se un utente può avere un solo ruolo allora inserisci nella tabella degli utenti il riferimento al ruolo
- se un utente può avere più ruoli allora fai una tabella intermedia a chiave doppia che associa ad ogni utente i ruoli



-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

bolla111 Profilo | Senior Member

i ruoli che ho in mente sono solo 2...nel mio caso ogni utente può avere un solo ruolo...l'amministratore ovviamente avrà sia i suoi privilegi che quelli degli altri utenti normali

samar Profilo | Senior Member

E' un classico:


id_ruolo| ruolo | note
------------------------------------------------------------
1 |amministratore|può fare quello che vuole
------------------------------------------------------------
2 | utente | solo quello che dico io

e aggiungi un campo id_ruolo alla tabella utenti

rossimarko Profilo | Guru

>i ruoli che ho in mente sono solo 2...nel mio caso ogni utente
>può avere un solo ruolo...l'amministratore ovviamente avrà sia
>i suoi privilegi che quelli degli altri utenti normali

Allora direi che va bene la soluzione con una tabella e il riferimento nella tabella degli utenti, che corrisponde a quanto riportato nell'articolo. Io avevo chiamato la tabella UserTypes, ma tu puoi benissimo chiamarla ruoli.

In questo modo partendo dalla username dell'utente puoi caricare il ruolo associato e gestirlo.

Il fatto che gli utenti possano fare meno cose degli amministratori lo puoi gestire in diversi modi. Dipende più che altro da come si deve comportare la tua applicazione. Se ad esempio alcune funzionalità di una pagina devono essere disabilitate allora la cosa dovrà essere fatta da codice all'interno della pagina stessa.
Altrimenti puoi prevedere pagine diverse e le pagine dell'utente saranno visibili anche all'amministratore, il contrario ovviamente no. Sempre nell'articolo ho inserito alcune configurazioni di esempio per come gestire gli accessi da web.config



-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

bolla111 Profilo | Senior Member

si capisco...diciamo che ciò che cambia da utente ad amministratore lo posso gestire da codice...
cmq ora sto guardando l'ultimo link che mi hai passato...
il primo problema che ho è che non so cos'è il global aspx...sai...sono alle primea armi...

rossimarko Profilo | Guru

Il global.asax è un file facoltativo che gestisce gli eventi globali dell'applicazione: http://msdn.microsoft.com/it-it/library/2027ewzw.aspx

Se non hai nessun file global.asax nella root del sito web puoi aggiungerlo facendo tasto destro sul progetto. Nell'elenco degli elementi dovresti avere una voce Global Application Class
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

bolla111 Profilo | Senior Member

si...l'ho inserito prima...grazie cmq...ora vedo cosa riesco a combinare

bolla111 Profilo | Senior Member

una cosa non mi è molto chiara...
nel link che mi hai passato, nel global.asax, vengono inseriti i nomi dei ruoli esistenti
myRoles[0] = "Manager";
myRoles[1] = "Admin";

con questa riga di codice mi hai detto che il ruolo viene impostato automaticamente all'utente che viene loggato giusto?
HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(id,myRoles);

rossimarko Profilo | Guru

>una cosa non mi è molto chiara...
>nel link che mi hai passato, nel global.asax, vengono inseriti
>i nomi dei ruoli esistenti
>myRoles[0] = "Manager";
>myRoles[1] = "Admin";
>
>con questa riga di codice mi hai detto che il ruolo viene impostato
>automaticamente all'utente che viene loggato giusto?
>HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(id,myRoles);

Si, però considera che questo pezzo per te non è valido:
>myRoles[0] = "Manager";
>myRoles[1] = "Admin";

Tu dovrai inserire il ruolo associato all'utente, quindi dovrai caricarlo da db.
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

bolla111 Profilo | Senior Member

ah ok...quello era il dubbio...quindi la solita storia...stringa di connessione, connessione al db, query sql ed ecc ecc

bolla111 Profilo | Senior Member

ciao...allora...sto perdendo un po di tempo xkè devo convertire le cose in vb
cmq io a myRoles[indice] devo inserire i ruoli che ho nella mia tabella di db...
ma come faccio?

rossimarko Profilo | Guru

Tu avrai un ruolo solo associato all'utente, quindi basterà dichiarare l'array di un elemento:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

bolla111 Profilo | Senior Member

niente...non riesco...
il primo problema è come recuperare i dati da db (cioè, come la faccio la query? come li prendo nome e pw che inserisco nelle textbox della login?)
poi non capisco questo pezzetto che mi hai postato l'ultima volta: GenericPrincipal(id,new String() { strRuolo });

rossimarko Profilo | Guru

>niente...non riesco...
>il primo problema è come recuperare i dati da db (cioè, come
>la faccio la query? come li prendo nome e pw che inserisco nelle
>textbox della login?)

Ti basta solo la username che dovrebbe essere univoca. Per prelevare la username puoi leggere il valore Name:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Dopo con questa username puoi accedere al db e caricare il nome del ruolo


>poi non capisco questo pezzetto che mi hai postato l'ultima volta:
>GenericPrincipal(id,new String() { strRuolo });

La sintassi new String() { strRuolo } serve per creare un nuovo array con un elemento. E' uno dei tanti modi di dichiarare un array (
http://www.morpheusweb.it/html/manuali/vbnet/vbnet_array.asp ).

Avrei potuto scrivere anche:
dim arrRuoli as String() = { strRuolo }

oppure

Dim arrRuoli As String() = New String(1) {} arrRuoli(0) = "pippo"



-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

bolla111 Profilo | Senior Member

mmmhh...non funziona...manca ancora qlcs...
e poi ho notato che con qualsiasi utente faccio il login, mi viene loggato sempre il primo

rossimarko Profilo | Guru

Cos'è che non funziona?

Hai verificato che l'utente che si logga venga correttamente registrato come l'utente loggato? Prova a postare il codice con cui fai la login..
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

bolla111 Profilo | Senior Member

questa è la pagina di login chiamata home.aspx

Protected Sub ButtonLogin_Click(ByVal sender As Object, ByVal e As System.Web.UI.ImageClickEventArgs) Handles ButtonLogin.Click

If Not (TextUtente.Text = "") And Not (TextPW.Text = "") Then

Dim user As String = TextUtente.Text
Dim password As String = TextPW.Text

ControlloUtente(user, password)

If controllo = True Then
FormsAuthentication.RedirectFromLoginPage(user, True)
'Response.Redirect("Default.aspx")
Else
LabelError.Text = "Nome Utente e/o Password non corretti"
End If

Else
LabelError.Text = "Nome Utente e/o Password non inseriti"
End If

End Sub

Private Function ControlloUtente(ByVal user As String, ByVal password As String)

connn = New SqlClient.SqlConnection("Server=APPLE-XP\SQLEXPRESS;Database=Attivita;Trusted_Connection=True;Integrated Security=True")
connn.Open()

Dim Sqlcontr As String = ""

Sqlcontr = "SELECT USID,USNOME FROM ESUSER WHERE USCOG='" & user & "' AND USPW='" & password & "'"

Dim getcount As SqlClient.SqlCommand
getcount = New SqlCommand(Sqlcontr, connn)
Dim reader As SqlClient.SqlDataReader

Try

reader = getcount.ExecuteReader()
If reader.Read() Then

'Aggiungo l'utente alla sessione ed effettuo il redirect alla Home

'Session.Add("USCOG", TextUtente.Text)

'connn.Close()
MsgBox("Corretto")
controllo = True

'connn.Open()

'Preleva il valore del primo campo della Select
'valore1 = getcount.ExecuteScalar.ToString

'Response.Redirect("Default.Aspx?USID=" & valore1)


Else
controllo = False
End If

Catch ex As Exception
' Errore
Finally
' Se la connessione è rimasta aperta, la chiudo
If Not connn Is Nothing Then
connn.Close()
End If

End Try

Return user

End Function

rossimarko Profilo | Guru

Commenta un attimo il codice del global.asax e poi in una pagina visualizza il contenuto del campo Page.User.Identity.Name

Questo campo, una volta loggato dovrebbe contenere la username dell'utente loggato, ovvero il valore del parametro user che tu hai passato alla funzione: FormsAuthentication.RedirectFromLoginPage(user, True)
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

bolla111 Profilo | Senior Member

l'errore l'ho trovato...una distrazione
nell'sql datasource avevo dimenticato di modificare una cosa...
io nella configurazione origine dati del datasource devo specificare l'origine di un parametro...quel parametro è in pratica il mio user...come lo configuro?

rossimarko Profilo | Guru

>l'errore l'ho trovato...una distrazione
>nell'sql datasource avevo dimenticato di modificare una cosa...
>io nella configurazione origine dati del datasource devo specificare
>l'origine di un parametro...quel parametro è in pratica il mio
>user...come lo configuro?

Scusami ma non ho capito la domanda..
Una cosa che ti suggerisco di fare è cambiare il command text delle tue query ed usare i parametri altrimenti sei a rischio SQL injection.
Il command text da così:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
deve dinventare
Sqlcontr = "SELECT USID,USNOME FROM ESUSER WHERE USCOG= @User AND USPW=@Pwd"

Qui trovi un bell'articolo che spiega cosa sia SQL injection e come risolvere: http://www.dotnethell.it/articles/SQL-Injection-Tutorial-Security.aspx
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

bolla111 Profilo | Senior Member

il mio problema:
nella mia pagina di default c'è un gridview e tramite sqldatasource lo popolo
solo che in questo sql datasource c'è un paramentro; in pratica ogni utente che entra nella pagina di default può vedere nel gridview solo i record che riguardano lui...
prima il mio parametro era di tipo query string, ma ora che ho modificato il tutto x i ruoli, il parametro che mi serve (cioè l'user) di che tipo è?

rossimarko Profilo | Guru

Una soluzione è quella di creare il parametro da codice nel page_load:

SqlDataSource1.SelectParameters.Add("nomeparametro", "valore")

Purtroppo non usando il ProfileProvider non puoi usare i parametri di tipo ProfileParameter.

In alternativa devi popolare la griglia da codice oppure usare l'ObjectDataSource
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

bolla111 Profilo | Senior Member

ciao
quel problemino l'ho risolto in modo un po barbaro creando una label nascosta e riempiendo il suo valore con il nome utente di login...così riempio il mio parametro dell' sqldatasource...
ora manca solo risolvere un problemino sull discorso ruoli...in pratica sembra funzionare (il ruolo tra login.aspx e default.aspx passa) ma se nel web.config aggiungo:
<deny users="*">
<allow roles="Amministratore">
<allow roles="Utente">

non mi lascia entrare alcun tipo di utente...perchè?


ho altre 3 domande da farti...2 delle quali riguardano in un certo modo il ruolo...domani mattina creo i thread...ciao
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5