Aggiunta di sicurezza e appartenenza a un sito di Pagine Web ASP.NET (Razor)

di Tom FitzMacken

Questo articolo illustra come proteggere un sito Web di Pagine Web ASP.NET (Razor) in modo che alcune pagine siano disponibili solo per gli utenti che accedono. Si vedrà anche come creare pagine a cui chiunque può accedere.

Cosa si apprenderà:

  • Come creare un sito Web con una pagina di registrazione e una pagina di accesso in modo che per alcune pagine sia possibile limitare l'accesso solo ai membri.
  • Come creare pagine pubbliche e di sola membro.
  • Come definire i ruoli, ovvero i gruppi che dispongono di autorizzazioni di sicurezza diverse nel sito e come assegnare utenti a un ruolo.
  • Come usare CAPTCHA per impedire ai programmi automatizzati (bot) di creare account membro.

Queste sono le funzionalità di ASP.NET introdotte nell'articolo:

  • Modello webMatrix Starter Site .
  • Helper WebSecurity e Roles classe.
  • Helper ReCaptcha .

Versioni software usate nell'esercitazione

  • Pagine Web ASP.NET (Razor) 2
  • WebMatrix 3
  • Libreria helper Web ASP.NET

È possibile configurare il sito Web in modo che gli utenti possano accedervi, ovvero in modo che il sito supporti l'appartenenza. Questo può essere utile per molti motivi. Ad esempio, il sito potrebbe avere pagine che devono essere disponibili solo per i membri. In alcuni casi, è possibile richiedere agli utenti di accedere per inviare commenti e suggerimenti o lasciare un commento.

Anche se il sito Web supporta l'appartenenza, gli utenti non devono necessariamente accedere prima di usare alcune delle pagine del sito. Gli utenti che non hanno eseguito l'accesso sono noti come utenti anonimi.

Un utente può registrarsi nel sito Web e quindi accedere al sito. Il sito Web richiede un nome utente (un indirizzo di posta elettronica) e una password per confermare che gli utenti sono quelli che sostengono di essere. Questo processo di accesso e conferma dell'identità di un utente è noto come autenticazione.

È possibile configurare la sicurezza e l'appartenenza in modi diversi:

  • Se si usa WebMatrix, un modo semplice consiste nel creare come nuovo sito basato sul modello di sito iniziale . Questo modello è già configurato per la sicurezza e l'appartenenza e ha già una pagina di registrazione, una pagina di accesso e così via.

    Il sito creato dal modello ha anche un'opzione per consentire agli utenti di accedere usando un sito esterno come Facebook, Google o Twitter.

  • Se si vuole aggiungere sicurezza a un sito esistente o se non si vuole usare il modello sito iniziale , è possibile creare una pagina di registrazione, una pagina di accesso e così via.

Questo articolo è incentrato sulla prima opzione: come aggiungere sicurezza usando il modello Sito iniziale . Fornisce anche alcune informazioni di base su come implementare la propria sicurezza e quindi fornisce collegamenti ad altre informazioni su come eseguire questa operazione. Sono inoltre disponibili informazioni su come abilitare gli account di accesso esterni, descritti in modo più dettagliato in un articolo separato.

Creazione della sicurezza del sito Web tramite il modello di sito iniziale

In WebMatrix è possibile usare il modello Starter Site per creare un sito Web contenente quanto segue:

  • Database usato per archiviare i nomi utente e le password per i membri.
  • Pagina di registrazione in cui gli utenti anonimi (nuovi) possono registrarsi.
  • Pagina di accesso e disconnessione.
  • Una pagina di ripristino e reimpostazione della password.

La procedura seguente descrive come creare il sito e configurarlo.

  1. Avviare WebMatrix e nella pagina Avvio rapido selezionare Sito da modello.

  2. Selezionare il modello Sito iniziale e quindi fare clic su OK. WebMatrix crea un nuovo sito.

  3. Nel riquadro sinistro fare clic sul selettore dell'area di lavoro File .

  4. Nella cartella radice del sito Web aprire il file _AppStart.cshtml , ovvero un file speciale usato per contenere le impostazioni globali. Contiene alcune istruzioni che vengono impostate come commento usando i // caratteri :

    //WebMail.SmtpServer = "mailserver.example.com";
    //WebMail.EnableSsl = true;
    //WebMail.UserName = "username@example.com";
    //WebMail.Password = "your-password";
    //WebMail.From = "your-name-here@example.com";
    

    Queste istruzioni configurano l'helper WebMail , che può essere usato per inviare messaggi di posta elettronica. Il sistema di appartenenza può usare la posta elettronica per inviare messaggi di conferma quando gli utenti eseguono la registrazione o quando vogliono modificare le password. Ad esempio, dopo la registrazione degli utenti, riceve un messaggio di posta elettronica che include un collegamento che può fare clic per completare il processo di registrazione.

    L'invio di messaggi di posta elettronica richiede l'accesso a un server SMTP, come descritto in Aggiunta di Email a un sito Pagine Web ASP.NET. Le impostazioni di posta elettronica verranno archiviate in questo file centrale _AppStart.cshtml in modo che non sia necessario codificarle ripetutamente in ogni pagina in grado di inviare messaggi di posta elettronica. Non è necessario configurare le impostazioni SMTP per configurare un database di registrazione. Sono necessarie solo le impostazioni SMTP se si desidera convalidare gli utenti dall'alias di posta elettronica e consentire agli utenti di reimpostare una password dimenticata.

  5. Rimuovere il commento dalle istruzioni rimuovendo // da davanti a ognuna di esse.

    Se non si vuole configurare la conferma tramite posta elettronica, è possibile ignorare questo passaggio e il passaggio successivo. Se i valori SMTP non sono impostati, il nuovo account sarà immediatamente disponibile senza un messaggio di posta elettronica di conferma.

  6. Modificare le impostazioni correlate alla posta elettronica seguenti nel codice:

    • Impostare WebMail.SmtpServer sul nome del server SMTP a cui si ha accesso.

    • Lasciare WebMail.EnableSsl impostato su true. Questa impostazione protegge le credenziali inviate al server SMTP crittografandole.

    • Impostare WebMail.UserName sul nome utente per l'account del server SMTP.

    • Impostare WebMail.Password sulla password per l'account del server SMTP.

    • Impostare WebMail.From sul proprio indirizzo di posta elettronica. Questo è l'indirizzo di posta elettronica da cui viene inviato il messaggio.

      Nota

      Mancia Per altre informazioni sui valori per queste proprietà, vedere Configuring Email Settings in Customizing Site-Wide Behavior for Pagine Web ASP.NET.For additional information about these properties, see Configuring Email Settings in Customizing Site-Wide Behavior for Pagine Web ASP.NET.

  7. Salvare e chiudere _AppStart.cshtml.

  8. Eseguire la pagina Default.cshtml in un browser.

    security-membership-2

    Nota

    Se viene visualizzato un errore che indica che una proprietà deve essere un'istanza di ExtendedMembershipProvider, il sito potrebbe non essere configurato per l'uso del sistema di appartenenza Pagine Web ASP.NET (SimpleMembership). Ciò può verificarsi a volte se il server di un provider di hosting è configurato in modo diverso rispetto al server locale. Per risolvere il problema, aggiungere l'elemento seguente al file Web.config del sito:

    <appSettings>
        <add key="enableSimpleMembership" value="true" />
    </appSettings>
    

    Aggiungere questo elemento come figlio dell'elemento <configuration> e come peer dell'elemento <system.web> .

  9. Nell'angolo superiore destro della pagina fare clic sul collegamento Registra . Viene visualizzata la pagina Register.cshtml .

  10. Immettere un nome utente e una password e quindi fare clic su Registra.

    security-membership-3

    Quando è stato creato il sito Web dal modello di sito iniziale , è stato creato un database denominato StarterSite.sdf nella cartella App_Data del sito. Durante la registrazione, le informazioni utente verranno aggiunte al database. Se si impostano i valori SMTP, viene inviato un messaggio all'indirizzo di posta elettronica usato in modo da poter completare la registrazione.

    security-membership-4

  11. Passare al programma di posta elettronica e trovare il messaggio, che avrà il codice di conferma e un collegamento ipertestuale al sito.

  12. Fare clic sul collegamento ipertestuale per attivare l'account. Il collegamento ipertestuale di conferma apre una pagina di conferma della registrazione.

    security-membership-5

  13. Fare clic sul collegamento Account di accesso e quindi accedere usando l'account registrato.

    Dopo l'accesso, i collegamenti Accesso e Registrazione vengono sostituiti da un collegamento Disconnessione . Il nome dell'account di accesso viene visualizzato come collegamento. Il collegamento consente di passare a una pagina in cui è possibile modificare la password.

    security-membership-6

    Nota

    Per impostazione predefinita, ASP.NET pagine Web inviano le credenziali al server in testo non crittografato (come testo leggibile dall'utente). Un sito di produzione deve usare HTTP sicuro (https://, noto anche come livello secure sockets o SSL) per crittografare le informazioni riservate scambiate con il server. È possibile richiedere l'invio di messaggi di posta elettronica usando SSL impostando WebMail.EnableSsl=true come nell'esempio precedente. Per altre informazioni su SSL, vedere Protezione delle comunicazioni Web: certificati, SSL e https://.

Funzionalità aggiuntive di appartenenza nel sito

Il sito contiene altre funzionalità che consentono agli utenti di gestire i propri account. Gli utenti possono eseguire le operazioni seguenti:

  • Modificare le password. Dopo l'accesso, è possibile fare clic sul nome utente (che è un collegamento). In questo modo vengono visualizzati in una pagina in cui è possibile creare una nuova password (Account/ChangePassword.cshtml).
  • Recuperare una password dimenticata. Nella pagina di accesso è presente un collegamento (Hai dimenticato la password?) che porta gli utenti a una pagina (Account/ForgotPassword.cshtml) in cui possono immettere un indirizzo di posta elettronica. Il sito invia un messaggio di posta elettronica con un collegamento su cui è possibile fare clic per impostare una nuova password (Account/PasswordReset.cshtml).

È anche possibile consentire agli utenti di accedere usando un sito esterno, come illustrato più avanti.

Creazione di una pagina Members-Only

Per il momento, chiunque può passare a qualsiasi pagina nel tuo sito Web. Ma potrebbe essere necessario avere pagine disponibili solo per le persone che hanno eseguito l'accesso (ovvero ai membri). ASP.NET consente di creare pagine accessibili solo dai membri connessi. In genere, se gli utenti anonimi tentano di accedere a una pagina solo membri, si reindirizza alla pagina di accesso.

In questa procedura verrà creata una cartella che conterrà pagine disponibili solo per gli utenti connessi.

  1. Nella radice del sito creare una nuova cartella. Nella barra multifunzione fare clic sulla freccia sotto Nuovo e quindi scegliere Nuova cartella.

  2. Denominare la nuova cartella Membri.

  3. All'interno della cartella Membri creare una nuova pagina e denotarla MembersInformation.cshtml.

  4. Sostituire il contenuto esistente con il codice e il markup seguenti:

    @{
        if (!WebSecurity.IsAuthenticated) {
            Response.Redirect("~/Account/Login?returnUrl="
                + Request.Url.LocalPath);
        }
        Layout = "~/_SiteLayout.cshtml";
        Page.Title = "Members Information";
    }
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="utf-8" />
        <title>Members Information</title>
      </head>
      <body>
        <p>You can only see this information if you've logged into the site.</p>
      </body>
    </html>
    

    Questo codice verifica la IsAuthenticated proprietà dell'oggetto WebSecurity , che restituisce true se l'utente ha eseguito l'accesso. Se l'utente non è connesso, il codice chiama Response.Redirect per inviare l'utente alla pagina Login.cshtml nella cartella Account .

    L'URL del reindirizzamento include un returnUrl valore della stringa di query che usa Request.Url.LocalPath per impostare il percorso della pagina corrente. Se si imposta il returnUrl valore nella stringa di query come questo (e se l'URL restituito è un percorso locale), la pagina di accesso restituirà gli utenti a questa pagina dopo l'accesso.

    Il codice imposta anche la pagina _SiteLayout.cshtml come pagina di layout. Per altre informazioni sulle pagine di layout, vedere Creazione di un layout coerente in Pagine Web ASP.NET Siti.

  5. Eseguire il sito. Se si è ancora connessi, fare clic sul pulsante Disconnessione nella parte superiore della pagina.

  6. Nel browser richiedere la pagina /Members/MembersInformation. Ad esempio, l'URL potrebbe essere simile al seguente:

    http://localhost:38366/Members/MembersInformation

    Il numero di porta (38366) sarà probabilmente diverso nell'URL.

    Si viene reindirizzati alla pagina Login.cshtml , perché non si è connessi.

  7. Accedere usando l'account creato in precedenza. Si viene reindirizzati alla pagina MembersInformation . Poiché si è connessi, questa volta viene visualizzato il contenuto della pagina.

Per proteggere l'accesso a più pagine, è possibile eseguire questa operazione:

  • Aggiungere il controllo di sicurezza a ogni pagina.
  • Creare una pagina _PageStart.cshtml nella cartella in cui si mantengono le pagine protette e aggiungere il controllo di sicurezza. La pagina _PageStart.cshtml funge da pagina globale per tutte le pagine della cartella. Questa tecnica è illustrata in modo più dettagliato in Personalizzazione del comportamento Site-Wide per Pagine Web ASP.NET.

Creazione di sicurezza per gruppi di utenti (ruoli)

Se il sito ha molti membri, non è efficiente controllare l'autorizzazione per ogni utente singolarmente prima di consentire loro di visualizzare una pagina. È invece possibile creare gruppi o ruoli a cui appartengono i singoli membri. È quindi possibile controllare le autorizzazioni in base al ruolo. In questa sezione si creerà un ruolo di "amministratore" e quindi si creerà una pagina accessibile agli utenti che appartengono a tale ruolo.In this section, you'll create an "admin" role and then create a page that's accessible to users who are in (who belong to) that role.

Il sistema di appartenenza ASP.NET è configurato per supportare i ruoli. Tuttavia, a differenza della registrazione dell'appartenenza e dell'account di accesso, il modello Starter Site non contiene pagine che consentono di gestire i ruoli. La gestione dei ruoli è un'attività amministrativa anziché un'attività utente. Tuttavia, è possibile aggiungere gruppi direttamente nel database di appartenenza in WebMatrix.

  1. In WebMatrix fare clic sul selettore dell'area di lavoro Database .

  2. Nel riquadro sinistro aprire il nodo StarterSite.sdf , aprire il nodo Tabelle e quindi fare doppio clic sulla tabella webpages_Roles .

    security-membership-7

  3. Aggiungere un ruolo denominato "admin". Il campo RoleId viene compilato automaticamente. È la chiave primaria ed è stata impostata come campo di identificazione, come illustrato in Introduzione all'uso di un database in Pagine Web ASP.NET Siti.

  4. Prendere nota del valore per il campo RoleId . Se si tratta del primo ruolo che si sta definendo, sarà 1.

    security-membership-8

  5. Chiudere la tabella webpages_Roles .

  6. Aprire la tabella UserProfile .

  7. Prendere nota del valore UserId di uno o più utenti nella tabella e quindi chiudere la tabella.

  8. Aprire la tabella webpages_UserInRoles e immettere un UserID e un valore RoleID nella tabella. Ad esempio, per inserire l'utente 2 nel ruolo "amministratore", immettere questi valori:

    security-membership-9

  9. Chiudere la tabella webpages_UsersInRoles .

    Dopo aver definito i ruoli, è possibile configurare una pagina accessibile agli utenti che si trovano in tale ruolo.

  10. Nella cartella radice del sito Web creare una nuova pagina denominata AdminError.cshtml e sostituire il contenuto esistente con il codice seguente. Questa sarà la pagina a cui gli utenti vengono reindirizzati se non sono autorizzati ad accedere a una pagina.

    @{
        Layout = "~/_SiteLayout.cshtml";
        PageData["Title"] = "Admin-only Error";
    }
    <p>You must log in as an admin to access that page.</p>
    
  11. Nella cartella radice del sito Web creare una nuova pagina denominata AdminOnly.cshtml e sostituire il codice esistente con il codice seguente:

    @{
        Layout = "~/_SiteLayout.cshtml";
        PageData["Title"] = "Administrators only";
    }
    
    @if ( Roles.IsUserInRole("admin")) {
        <span> Welcome <b>@WebSecurity.CurrentUserName</b>! </span>
    }
    else {
         Response.Redirect("~/AdminError");
    }
    

    Il Roles.IsUserInRole metodo restituisce true se l'utente corrente è un membro del ruolo specificato ,in questo caso il ruolo "admin".

  12. Eseguire Default.cshtml in un browser, ma non eseguire l'accesso. Se è già stato effettuato l'accesso, disconnettersi.

  13. Nella barra degli indirizzi del browser aggiungere AdminOnly nell'URL. In altre parole, richiedere il file AdminOnly.cshtml . Si viene reindirizzati alla pagina AdminError.cshtml perché non si è attualmente connessi come utente nel ruolo "admin".

  14. Tornare a Default.cshtml e accedere come utente aggiunto al ruolo "admin".

  15. Passare alla pagina AdminOnly.cshtml . Questa volta viene visualizzata la pagina.

Impedire ai programmi automatizzati di partecipare al sito Web

La pagina di accesso non impedisce ai programmi automatizzati (detti anche robot Web o bot) di registrarsi con il sito Web. Questa procedura descrive come abilitare un test ReCaptcha per la pagina di registrazione.

/media/38777/ch16securitymembership-18.jpg

  1. Registrare il sito Web con il servizio ReCaptcha. Al termine della registrazione, si otterranno una chiave pubblica e una chiave privata.

  2. Aggiungere la libreria helper Web di ASP.NET al sito Web come descritto in Installazione di helper in un sito Pagine Web ASP.NET, se non è già stato fatto.

  3. Nella cartella Account aprire il file denominato Register.cshtml.

  4. Nel codice nella parte superiore della pagina trovare le righe seguenti e rimuovere il commento rimuovendo i // caratteri di commento:

    if (!ReCaptcha.Validate("PRIVATE_KEY")) {
        ModelState.AddError("recaptcha", "Captcha response was not correct");
    }
    
  5. Sostituire PRIVATE_KEY con la propria chiave privata ReCaptcha.

  6. Nel markup della pagina rimuovere i @* caratteri e *@ commentando da intorno alle righe seguenti nel markup della pagina:

    @ReCaptcha.GetHtml("PUBLIC_KEY", theme: "white")
    @Html.ValidationMessage("recaptcha")
    
  7. Sostituire PUBLIC_KEY con la chiave.

  8. Se non è già stato rimosso, rimuovere l'elemento che contiene testo che inizia con "Per abilitare la <div> verifica CAPTCHA ...". Rimuovere l'intero <div> elemento e il relativo contenuto.

  9. Eseguire Default.cshtml in un browser. Se si è connessi al sito, fare clic sul collegamento Disconnessione .

  10. Fare clic sul collegamento Registra e testare la registrazione usando il test CAPTCHA.

    security-membership-10

Per altre informazioni sull'helper, vedere Using a CATPCHA to Prevent Automated Programs (Bots) from Using Your ASP.NET Web Site ( Uso di catpCHA per impedire l'usoReCaptcha di programmi automatizzati - bot).

Consentire agli utenti di accedere usando un sito esterno

Il modello Starter Site include codice e markup che consente agli utenti di accedere usando Facebook, Windows Live, Twitter, Google o Yahoo. Per impostazione predefinita, questa funzionalità non è abilitata. La procedura generale per consentire agli utenti di accedere usando questi provider esterni è la seguente:

  • Decidere quali siti esterni si desidera supportare.
  • Se necessario, passare a tale sito e configurare un'app di accesso. Ad esempio, è necessario eseguire questa operazione per consentire gli account di accesso di Facebook.
  • Nel sito configurare il provider. Nella maggior parte dei casi, è sufficiente rimuovere il commento da parte di codice nel file _AppStart.cshtml .
  • Aggiungere markup alla pagina di registrazione che consente agli utenti di collegarsi al sito esterno per l'accesso. In genere è possibile copiare il markup necessario e modificare leggermente il testo.

Per istruzioni dettagliate, vedere l'argomento Abilitazione dell'accesso da siti esterni in un sito di Pagine Web ASP.NET.

Dopo che un utente accede da un altro sito, l'utente torna al sito e associa tale account di accesso al sito. In effetti, viene creata una voce di appartenenza nel sito per l'account di accesso esterno dell'utente. In questo modo è possibile usare le normali funzionalità di appartenenza (ad esempio i ruoli) con l'account di accesso esterno.

Aggiunta di sicurezza a un sito Web esistente

La procedura descritta in precedenza in questo articolo si basa sull'uso del modello Starter Site come base per la sicurezza del sito Web. Se non è pratico iniziare dal modello Starter Site o copiare le pagine pertinenti da un sito basato su tale modello, è possibile implementare lo stesso tipo di sicurezza nel proprio sito codificandolo manualmente. È possibile creare gli stessi tipi di pagine, ovvero registrazione, accesso e così via, quindi usare helper e classi per configurare l'appartenenza.

Il processo di base è descritto nel post di blog IL modo più semplice per implementare ASP.NET sicurezza Razor. La maggior parte del lavoro viene eseguita usando i metodi e le proprietà seguenti dell'helper WebSecurity :

Per gestire i ruoli, è possibile usare le classi Ruoli e appartenenze , come descritto nella voce di blog.

Risorse aggiuntive