Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Sistema login

  1. #1

    Sistema login

    Salve,


    Sto creando un sistema di login in VB.NET che deve funzionare in questo modo:


    1) In un form che si trova nella pagina login.aspx chiedo all'utente username e password;


    2) Passo i parametri in POST alla pagina check.aspx che controlla la loro correttezza appoggiandosi ad un database;


    3) Se sono errati stampa un errore, se esatti reindirizza l'utente ad una pagina privata (private.aspx).




    Fino a qua ho fatto tutto. Adesso dovrei riuscire ad evitare l'accesso a questa pagina andando semplicemente a richiamare direttamente l'url, aggirando così la procedura di login.


    Vorrei sapere che strada/oggetti/procedure devo seguire/utilizzare per riuscire a metterlo in pratica.




    Per ora mi bastarebbero queste linee guida, se incontro problemi nell'implementazione vi farò sapere


    Grazie.

  2. #2
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    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.
    Ultima modifica di djciko; 05-10-2013 a 01:49

  3. #3
    Ti ringrazio della spiegazione.

    Prima di buttare via il lavoro fatto però, vorrei sapere se é l'unica soluzione.

    Ad esempio, se invio un parametro POST dalla pagina check.aspx alla pagina private.aspx e, nella Page_Load() di quest'ultima, eseguo un controllo su questo parametro potrebbe essere una soluzione?

  4. #4
    Al momento del login, se le credenziali sono corrette, potresti inserire una variabile (o anche un oggetto) nella sessione, ad esempio il nome dell'utente per eventualmente stamparlo nelle pagine protette. Qualcosa tipo
    codice:
    Session("user") = "nomeutente"
    In questo modo quando si accede alla pagina private.aspx come prima cosa controlli se Session("user") è nulla e in tal caso redirigi l'utente alla pagina di login. Così puoi anche stampare un eventuale link per fare il logout nella pagina private.aspx.

  5. #5
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    La soluzione sopra esposta sembra complicata ma non lo e'...provala.
    Anche quella di Partime va bene, se proprio non ti va di usare gli oggetti del FW.

    Comunque, ora ci sono i MemberShip Providers. Cerca su MSDN

Tag per questa discussione

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.