Devi usare la tecnica di FormsAuthentication, non fare le cose a mano.
Nella versione "estesa" (senza providers scritti apposta per la gestione dei ruoli), le regole DI DEFAULT della tecnica (ovviamente dal Web.Config si possono cambiare, ma per ora lascia perdere):
1- Pagina di Login: si deve chiamare "Login.aspx"
2- Pagina di Default (a cui viene reindirizzato l'utente se le credenziali sono corrette): si deve chiamare "Default.aspx"
ESEMPIO:
Per una applicazione con tre CARTELLE all'interno della solution: "area_admin", "area_utente", "area_guest"
File web.config:
codice:<?xml version="1.0"?> <configuration> <system.web> <compilation defaultLanguage="vb" debug="true" /> <authentication mode="Forms"> <forms loginUrl="Login.aspx" /> </authentication> <authorization> <deny users="?" /> </authorization> <sessionState mode="InProc" /> <trace enabled="false" requestLimit="10" pageOutput="false" traceMode="SortByTime" localOnly="true" /> </system.web> <!-- Gestione Accessi --> <location path="area_admin"> <system.web> <authorization> <allow roles="admin" /> <deny users="*" /> </authorization> </system.web> </location> <location path="area_utente"> <system.web> <authorization> <allow roles="admin,utente"/> <deny users="*" /> </authorization> </system.web> </location> <location path="area_guest"> <system.web> <authorization> <allow roles="admin,utente,guest"/> <deny users="*" /> </authorization> </system.web> </location> </configuration>
File XML che simula la tabella del DB relativa agli utenti ed ai ruoli:
codice:<?xml version="1.0" encoding="utf-8" ?> <utenti> <utente> <username>utente1</username> <password>password1</password> <ruolo>admin</ruolo> </utente> <utente> <username>utente2</username> <password>password2</password> <ruolo>utente</ruolo> </utente> <utente> <username>utente3</username> <password>password3</password> <ruolo>guest</ruolo> </utente> </utenti>
Sub che va inserita nel file Global.asax.vb:
codice:Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs) If Context.Request.IsAuthenticated Then ' Cerca un ruolo per l'utente corrente Dim dsUtenti As New System.Data.DataSet Dim riga_utente() As System.Data.DataRow Dim ruoli() As String Dim AppPath As String = Request.ApplicationPath Dim percorsoXML As String = Server.MapPath(AppPath & "/utenti.xml") dsUtenti.ReadXml(percorsoXML) riga_utente = dsUtenti.Tables(0).Select("username='" & HttpContext.Current.User.Identity.Name & "'") ruoli = Split(riga_utente(0)("ruolo"), ",") ' Assegna il ruolo letto nel file XML all'utente corrente System.Web.HttpContext.Current.User = New System.Security.Principal.GenericPrincipal(System.Web.HttpContext.Current.User.Identity, ruoli) End If End Sub
Pagina Login.aspx (con due textbox, "tbUserid" e "tbPassword" ed un Button, "btLogin"):
codice:Protected Sub btLogin_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btLogin.Click Dim dsUtenti As New DataSet Dim riga_utente() As DataRow ' Legge il file XML degli utenti e lo mette nel Dataset Dim AppPath As String = Request.ApplicationPath Dim percorsoXML As String = Server.MapPath(AppPath & "/utenti.xml") dsUtenti.ReadXml(percorsoXML) ' Cerca nel DataTable del Dataset appena riempito riga_utente = dsUtenti.Tables(0).Select("username='" & tbUserid.Text & "'") ' Se trova l'utente nel file XML... If riga_utente.Length > 0 And riga_utente(0)("password") = tbPassword.Text Then FormsAuthentication.RedirectFromLoginPage(tbUserid.Text.Trim, False) Else lbmessaggio.Text = "== Accesso non autorizzato ==" End If End Sub
Pagina Default.aspx (PRESENTAZIONE):
[Attenzione: devi creare anche TRE pagine nelle TRE aree, "admin.aspx", "utente.aspx", "guest.aspx" - sono le tre pagine di accoglienza a seconda del ruolo]
codice:<%@ Page Language="vb" AutoEventWireup="false" CodeFile="default.aspx.vb" Inherits="_default" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> </HEAD> <body bgcolor="#e9f404"> <form id="Form1" method="post" runat="server"> <br> <br> <div align="center"> <asp:Label ID="msg" Runat="server"></asp:Label> <br> <br> <asp:HyperLink NavigateUrl="area_admin/admin.aspx" text="Vai alla sezione Admin" Runat="server" Id="link_admin"></asp:HyperLink> <br> <br> <asp:HyperLink NavigateUrl="area_utente/utente.aspx" text="Vai alla sezione Utente" Runat="server" Id="link_utente"></asp:HyperLink> <br> <br> <asp:HyperLink NavigateUrl="area_guest/guest.aspx" text="Vai alla sezione Guest" Runat="server" Id="link_guest"></asp:HyperLink> <br> <br> <asp:Button ID="btLogout" Runat="server" Text="Logout" style="BORDER-RIGHT:medium none;BORDER-TOP:medium none;BORDER-LEFT:medium none;BORDER-BOTTOM:medium none"></asp:Button> </form> <hr> </body> </HTML>
Pagina Default.aspx (CODE-BEHIND):
codice:Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Response.Write("Dominio\Utente: <b>" & System.Security.Principal.WindowsIdentity.GetCurrent().Name & "</b><br><hr>") If User.IsInRole("admin") Then msg.Text = "<b>" & UCase(User.Identity.Name) & "</b>" & ", sei un <b>ADMIN</b> Hai permessi da amministratore per questo sito." End If If User.IsInRole("utente") Then msg.Text = "<b>" & UCase(User.Identity.Name) & "</b>" & ", sei un <b>UTENTE</b> Benvenuto nella nostra comunità." link_admin.Text += " [accesso negato]" link_admin.Enabled = False link_guest.Text += " [accesso negato]" link_guest.Enabled = False End If If User.IsInRole("guest") Then msg.Text = "<b>" & UCase(User.Identity.Name) & "</b>" & ", sei un <b>OSPITE</b> Registrati al nostro sito." link_admin.Text += " [accesso negato]" link_utente.Text += " [accesso negato]" link_admin.Enabled = False link_utente.Enabled = False End If End Sub Private Sub btLogout_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btLogout.Click FormsAuthentication.SignOut() FormsAuthentication.RedirectToLoginPage() End Sub
Questo sistema crea delle aree protette tramite ruolo (ATTENZIONE: dalla 2.0 sono stati introdotti i providers che ti permettono di scrivere meno codice !)
Ad esempio, se provi ad accedere ad un'area diversa da quella consentita (area_admin per gli Admin etc) ti ridireziona alla pagina di login.

Rispondi quotando
