Abilitare la generazione di codice a matrice per le app di autenticazione TOTP in ASP.NET Core
ASP.NET Core viene fornito con supporto per le applicazioni di autenticazione per l'autenticazione singola. Le app di autenticazione a due fattori (2FA), che usano un algoritmo TOTP (One-Time Password Algorithm), sono l'approccio consigliato dal settore per 2FA. 2FA con TOTP è preferibile a SMS 2FA. Un'app di autenticazione fornisce un codice da 6 a 8 cifre che gli utenti devono immettere dopo aver confermato il nome utente e la password. In genere, un'app di autenticazione viene installata su uno smartphone.
Avviso
Un ASP.NET codice TOTP core deve essere mantenuto segreto perché può essere usato per l'autenticazione correttamente più volte prima della scadenza.
I modelli di app Web core ASP.NET supportano gli autenticatori, ma non forniscono supporto per la generazione di codice a matrice. I generatori di codice a matrice semplificano la configurazione di 2FA. Questo documento fornisce indicazioni per Razor le app Pages e MVC su come aggiungere la generazione di codice a matrice alla pagina di configurazione 2FA. Per indicazioni applicabili a Blazor Web Apps, vedere Abilitare la generazione di codice a matrice per le app di autenticazione TOTP in un ASP.NET Core Blazor Web App. Per istruzioni applicabili alle app di Blazor WebAssembly, vedere Abilitare la generazione di codici QR per le app di autenticazione TOTP in ASP.NET Core Blazor WebAssembly con ASP.NET Core Identity.
I modelli di app Web core ASP.NET supportano gli autenticatori, ma non forniscono supporto per la generazione di codice a matrice. I generatori di codice a matrice semplificano la configurazione di 2FA. Questo documento illustra come aggiungere la generazione di codice a matrice alla pagina di configurazione 2FA.
L'autenticazione a due fattori non avviene usando un provider di autenticazione esterno, ad esempio Google o Facebook. Gli account di accesso esterni sono protetti da qualsiasi meccanismo fornito dal provider di accesso esterno. Si consideri, ad esempio, che il provider di autenticazione Microsoft richieda una chiave hardware o un altro approccio 2FA. Se i modelli predefiniti richiedono 2FA sia per l'app Web che per il provider di autenticazione esterno, gli utenti devono soddisfare due approcci 2FA. La richiesta di due approcci 2FA devia dalle procedure di sicurezza stabilite, che in genere si basano su un unico metodo 2FA sicuro per l'autenticazione.
Aggiunta di codici a matrice alla pagina di configurazione 2FA
Queste istruzioni usano qrcode.js
dal https://davidshimjs.github.io/qrcodejs/ repository.
- Scaricare la
qrcode.js
libreria JavaScript nellawwwroot\lib
cartella del progetto. - Seguire le istruzioni in Scaffold Identity per generare
/Areas/Identity/Pages/Account/Manage/EnableAuthenticator.cshtml
. - In
/Areas/Identity/Pages/Account/Manage/EnableAuthenticator.cshtml
individuare laScripts
sezione alla fine del file:
@section Scripts {
@await Html.PartialAsync("_ValidationScriptsPartial")
}
- Creare un nuovo file JavaScript denominato
qr.js
inwwwroot/js
e aggiungere il codice seguente per generare il codice a matrice:
window.addEventListener("load", () => {
const uri = document.getElementById("qrCodeData").getAttribute('data-url');
new QRCode(document.getElementById("qrCode"),
{
text: uri,
width: 150,
height: 150
});
});
- Aggiornare la
Scripts
sezione per aggiungere un riferimento allaqrcode.js
libreria scaricata in precedenza. - Aggiungere il
qr.js
file con la chiamata per generare il codice a matrice:
@section Scripts {
@await Html.PartialAsync("_ValidationScriptsPartial")
<script type="text/javascript" src="~/lib/qrcode.js"></script>
<script type="text/javascript" src="~/js/qr.js"></script>
}
- Eliminare il paragrafo che vi collega a queste istruzioni.
Eseguire l'app e assicurarsi di poter analizzare il codice a matrice e convalidare il codice dimostrato dall'autenticatore.
Modificare il nome del sito nel codice a matrice
Il nome del sito nel codice a matrice viene ricavato dal nome del progetto scelto durante la creazione iniziale del progetto. È possibile modificarlo cercando il GenerateQrCodeUri(string email, string unformattedKey)
metodo in /Areas/Identity/Pages/Account/Manage/EnableAuthenticator.cshtml.cs
.
Il codice predefinito del modello è simile al seguente:
private string GenerateQrCodeUri(string email, string unformattedKey)
{
return string.Format(
AuthenticatorUriFormat,
_urlEncoder.Encode("Razor Pages"),
_urlEncoder.Encode(email),
unformattedKey);
}
Il secondo parametro nella chiamata a string.Format
è il nome del sito, ricavato dal nome della soluzione. Può essere modificato in qualsiasi valore, ma deve essere sempre codificato in URL.
Uso di una diversa libreria di codice a matrice
È possibile sostituire la libreria del codice a matrice con la libreria preferita. Il codice HTML contiene un qrCode
elemento in cui è possibile inserire un codice a matrice tramite qualsiasi meccanismo fornito dalla libreria.
L'URL formattato correttamente per il codice a matrice è disponibile in:
-
AuthenticatorUri
proprietà del modello. -
data-url
proprietà nell'elementoqrCodeData
.
Asimmetria dell'ora del client e del server TOTP
L'autenticazione TOTP (one-time-based One-Time Password) dipende sia dal server che dal dispositivo di autenticazione con un tempo preciso. I token durano solo 30 secondi. Se gli account di accesso TOTP 2FA hanno esito negativo, verificare che l'ora del server sia accurata e preferibilmente sincronizzata con un servizio NTP accurato.