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.