Two Factor Authentication

in ASPNET Core, C#

Two Factor Authentication con Microsoft Authenticator

Reading Time: 3 minutes

Aggiungere un ulteriore componente nel flusso di autenticazione, basato solitamente su username e password, è spesso un requisito fondamentale. Questo tipo di approccio prende il nome di Autenticazione a due fattori (2FA) e solitamente fa uso di un elemento esterno che fornisce un pin, da inserire in fase di autenticazione, dopo l’inserimento della password.

Questo meccanismo consente ad un utente malitenzionato di non poter accedere al sistema, nel caso in cui la password sia stata compromessa. Se in fase di generazione del pin viene associato anche un meccanismo di generazione che prevede l’impronta dell’utente, siamo in presenza di un sistema di autenticazione a 3 fattori.

In ASPNET.Core è presente tutto il necessario per realizzare un sistema di autenticazione a 2 fattori. Il modello consente di utilizzare la password dell’utente in combinazione con un token generato da un sistema di autenticazione esterno come Google Authenticator e Microsoft Authenticator. Per entrambi è necessario installare sul proprio device Android o Apple la relativa app scaricabile direttamente dai relativi store.

Creazione del progetto

Dalla console creiamo una semplice applicazione basata su Razor Pages, con un sistema di autenticazione basato su Identity:

dotnet new razor --auth Individual

Per impostazione predefinita gli utenti vengono memorizzati all’interno di un database SqlLite, posizionato nella root del progetto e chiamato app.db.

Sempre per impostazione predefinita il progetto non conterrà la view per la gestione degli utenti: per l’abilitazione è possibile seguire i passi del post “Scaffolding Identity Pages” . In pratica le pagine sono caricate da un pacchetto Nuget, in modo da poter caricare solo quelle che effettivamente sono necessarie.

Nel nostro caso la pagina che dovrà essere aggiunta al progetto è Nel nostro caso, il Account\Manage\EnableAuthenticator che consente di abilitare l’autenticazione esterna. Inoltre, per poter semplificare le operazioni di accesso agli utenti, prevediamo la generazione di un QRCode che conterrà tutte le informazioni necessarie per utilizzare Microsoft Authenticator.

Nel nostro caso verrà inclusa una libreria javascript, chiamata qrcode.js . La libreria deve essere posizionata all’interno della cartella wwwroot. Modifichiamo quindi la view per EnableAuthenticator, aggiungendo il riferimento alla libreria qrcode.js. Per farlo aggiungiamo una sezione @Scripts :

@section Scripts {
    <partial name="_ValidationScriptsPartial" />
    <script src="~/lib/qrcode/qrcode.min.js"></script>
    <script type="text/javascript">
        new QRCode(document.getElementById("qrCode"),
            {
                text: "@Html.Raw(Model.AuthenticatorUri)",
                width: 200,
                height: 200
            });
    </script>
}

Utilizzando @Html.Raw il campo text del QRCode conterrà il link al sistema di autenticazione esterno, che verrà impostato dal controller all’interno di Model.AuthenticatorUri . Il risultato dell’inclusione avrà l’aspetto seguente:

Da notare la presenza dell’input dove l’utente dovrà inserire il Verification Code. Una volta scansionato il QRCode, l’app genererà un nuovo code ogni 30 secondi. Una volta inserito, la configurazione del sistema di autenticazione a due fattori sarà terminata.

Ad ogni successivo tentativo di login, dove saranno richiesti username e password, una volta effettuata la prima autenticazione l’utente sarà redirezionato verso la pagina di autenticazione esterna dove dovrà inserire il codice generato dall’app esterna.

ASPNET Core consente di aggiungere l’autenticazione a due fattori in maniera semplice e soprattutto sicura.