Le applicazioni moderne si allontanano sempre più dalle password tradizionali e si orientano verso metodi di autenticazione senza password, più sicuri e più semplici per gli utenti. In questo post, mostrerò come autenticare gli utenti in un'applicazione ASP.NET Core generata dall'intelligenza artificiale utilizzando FoxIDs con OpenID Connect e abilitare un'esperienza di accesso completamente senza password utilizzando codici monouso inviati via email.
Inizieremo da un ambiente FoxIDs pulito, creeremo una nuova app Web ASP.NET Core, la collegheremo a OpenID Connect e infine abiliteremo l'accesso passwordless con OTP basato su e-mail.
Creazione di un ambiente di sviluppo FoxIDs
Ho iniziato creando un nuovo ambiente di sviluppo vuoto in FoxIDs. Un ambiente pulito semplifica la configurazione dell'autenticazione da zero e garantisce la possibilità di replicare questi passaggi nel tuo tenant.
Se non hai mai utilizzato FoxIDs, puoi creare un tenant gratuito all'indirizzo:
Ogni tenant viene fornito con due ambienti pronti all'uso per consentirti di sperimentare liberamente.
Configura l'autenticazione
Inizia da configuring come gli utenti dovrebbero accedere. In questo caso, vogliamo che gli utenti accedano senza password, utilizzando solo il loro indirizzo email e una password monouso (OTP) inviata loro.
- Seleziona la scheda Autenticazioni nel tuo ambiente FoxIDs.
- Fai clic su Predefinita: interfaccia utente di accesso utente.
- Nella sezione Autenticazione, disabilita Autenticazione tramite password e abilita Senza password con email (password monouso).
- Fai clic su Aggiorna per salvare le modifiche.
Ciò consente agli utenti di creare un nuovo account e fornisce un'esperienza senza password in cui si autenticano semplicemente inserendo il proprio indirizzo e-mail e il codice OTP che ricevono.
Genera l'applicazione ASP.NET Core
Successivamente, abbiamo bisogno di un'applicazione per l'autenticazione. È possibile utilizzare il prompt AI per generare una nuova applicazione ASP.NET Core Razor Pages destinata a .NET 10 o aggiungere OpenID Connect a un'applicazione esistente.
Leggi il post "Autenticazione senza password in ASP.NET Core con FoxIDs e OTP basato su e-mail" se desideri creare manualmente l'applicazione ASP.NET Core.
Per questa procedura dettagliata, sto generando una semplice applicazione ASP.NET Core in VS Code con Codex. Potresti anche usare Copilot.
Sei uno sviluppatore esperto ASP.NET Core.
Obiettivo: creare (o aggiornare) un'app Web ASP.NET Core che autentica gli utenti con FoxIDs utilizzando OpenID Connect (flusso del codice di autorizzazione), utilizzando l'autenticazione del cookie per la sessione locale e OIDC come schema di verifica.
### Modalità (sceglierne una)
- MODE = "NEW_APP" -> crea una nuova app Razor Pages
- MODE = "EXISTING_APP" -> modifica la soluzione corrente senza interrompere percorsi/pagine esistenti
MODE: {{MODE}}
### Dettagli dell'app
- ProjectName: {{PROJECT_NAME}} (utilizzato solo se MODE = "NEW_APP")
- TargetFramework: net10.0 (o mantieni esistente se più recente)
- URL HTTPS locale (deve corrispondere all'indirizzo base URI di reindirizzamento FoxIDs): {{APP_BASE_URL}} (esempio: https://localhost:7283/)
### Configurazione FoxIDs OIDC
Non codificare Authority, ClientId o ClientSecret nel codice o in questo prompt.
Invece:
- Leggili dalle chiavi di configurazione:
- "IdentitySettings:Authority"
- "IdentitySettings:ClientId"
- "IdentitySettings:ClientSecret"
- La risposta finale deve spiegare chiaramente all'utente dove e come impostare questi valori di configurazione (ad esempio in appsettings.json, variabili di ambiente o segreti utente).
### Requisiti di attuazione
1) Aggiungi l'autenticazione in Program.cs:
- Configura l'autenticazione:
- DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme
- DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme
- Aggiungi l'autenticazione dei cookie.
- Aggiungi l'autenticazione OpenID Connect:
- Authority dalla configurazione: "IdentitySettings:Authority"
- ClientId dalla configurazione: "IdentitySettings:ClientId"
- ClientSecret dalla configurazione: "IdentitySettings:ClientSecret"
- ResponseType = "code"
- SaveTokens = true
- Scopes: "openid", "profile", "email", "offline_access"
- MapInboundClaims = false
- TokenValidationParameters:
- NameClaimType = "sub"
- RoleClaimType = "role"
- Aggiungi OpenIdConnectEvents con:
- OnAuthenticationFailed: solo in Development, restituisce una semplice risposta in testo semplice con il messaggio di eccezione per il debug. Non esporre mai i dettagli dell'eccezione o PII nella produzione.
- Assicurati che il middleware sia registrato:
- app.UseAuthentication() viene chiamato prima di app.UseAuthorization().
2) Aggiungi cablaggio di configurazione:
- Aggiungi una sezione `IdentitySettings` in appsettings.json contenente solo valori segnaposto non segreti, ad esempio:
- "Authority": "https://your-foxids-authority/"
- "ClientId": "your-client-id"
- Leggi "IdentitySettings:ClientSecret" dalla configurazione, ma memorizza il suo valore nei segreti utente .NET per lo sviluppo locale o in una variabile di ambiente o in un archivio segreto sicuro in produzione.
- Se MODE = "EXISTING_APP", unisci questa sezione nella configurazione esistente senza sovrascrivere le impostazioni non correlate.
- Aggiungi commenti o testo esplicativo nella risposta finale che:
- Questi valori devono essere sostituiti dall'utente con i loro reali FoxIDs Authority, ClientId e ClientSecret.
- I segreti non devono essere scritti in appsettings.json o impegnati nel controllo del codice sorgente.
3) Aggiungi endpoint di accesso/disconnessione:
- Crea `Controllers/AuthController.cs` con un controller MVC standard:
- Utilizza lo schema di percorso `[controller]/[action]`.
- Azione di accesso (GET):
- Se l'utente è già autenticato, reindirizza a "/".
- Altrimenti, emetti un Challenge utilizzando OpenIdConnectDefaults.AuthenticationScheme con RedirectUri = "/".
- Azione di disconnessione (POST, con [ValidateAntiForgeryToken]):
- Se l'utente non è autenticato, reindirizza a "/".
- Altrimenti, SignOut da:
- CookieAuthenticationDefaults.AuthenticationScheme e
- OpenIdConnectDefaults.AuthenticationScheme
con uno RedirectUri = "/".
4) Aggiungi accesso parziale all'interfaccia utente:
- Crea `Pages/Shared/_LoginPartial.cshtml`.
- Comportamento:
- Se l'utente è autenticato:
- Mostra un pulsante "Disconnetti" che pubblica su `Auth/Logout` con un token antifalsificazione.
- Se l'utente non è autenticato:
- Mostra un collegamento "Accedi" che punta a `Auth/Login`.
5) Aggiungi parziale al layout:
- Aggiorna `Pages/Shared/_Layout.cshtml` per includere:
- `<partial name="_LoginPartial" />` nell'area della barra di navigazione, preferibilmente allineato al lato destro della barra di navigazione.
- Non rimuovere il contenuto del layout esistente.
6) Comportamento della home page (per la visualizzazione dei claims):
- Se MODE = "NEW_APP" o se la home page esistente è effettivamente vuota (solo testo standard o nessun contenuto significativo):
- Implementa una semplice home page che:
- Dà il benvenuto all'utente.
- Se l'utente è autenticato, visualizza un elenco o una tabella dei claims dell'utente (tipo e valore).
- Se l'utente non è autenticato, viene visualizzato un messaggio del tipo "Non hai effettuato l'accesso" e un suggerimento per fare clic sul collegamento di accesso.
- Se MODE = "EXISTING_APP" e la home page presenta già contenuti significativi:
- Non modificare la home page esistente per aggiungere la visualizzazione dei claims.
- Lascia intatto il contenuto della home page esistente.
### Aspettative di produzione
1) Modifiche al codice e al file:
- Elenca tutti i file creati o modificati.
- Per ogni file, genera il contenuto completo del file (o un diff molto chiaro se il file è di grandi dimensioni).
- Assicurati che il progetto possa essere creato ed eseguito con `dotnet run` (o il comando consueto per il framework di destinazione scelto).
2) Posizionamento e guida alla configurazione:
- Mostra chiaramente esattamente dove vengono letti nel codice i valori di configurazione Authority, ClientId e ClientSecret (sezione IdentitySettings).
- Spiegare all'utente:
- Che devono impostare questi valori dopo la generazione del codice.
- Come impostare Authority e ClientId in appsettings.json.
- Come impostare ClientSecret nei segreti utente localmente o in una variabile di ambiente o in un archivio segreto sicuro in produzione.
3) Informazioni sull'endpoint dell'applicazione:
- Nella risposta finale all'utente, dichiara esplicitamente:
- L'URL dell'endpoint locale su cui è in ascolto l'applicazione (ad esempio: `{{APP_BASE_URL}}` o l'URL utilizzato dal modello).
- Un'istruzione breve e chiara che dice all'utente:
- "Configura il tuo FoxIDs Authority e ClientId nella sezione IdentitySettings. Memorizza ClientSecret nei segreti utente localmente o in una variabile di ambiente o in un archivio segreto sicuro in produzione, in modo che possa essere letto in fase di esecuzione senza essere impegnato."
4) Guardrail:
- Non introdurre refactoring non correlato.
- Non rimuovere alcuna funzionalità esistente oltre a quanto strettamente necessario per integrare OIDC con FoxIDs.
- Mantieni la soluzione focalizzata su:
- Aggiunta cookie + autenticazione OIDC,
- AuthController,
- Accesso parziale,
- Modifiche minime alla home page come descritto.
Ora implementa tutto quanto sopra.
La risposta dell'IA dovrebbe indicarti dove configurare Authority, ID client e Segreto client.
Ora prova a eseguire l'applicazione per trovare l'endpoint.
La mia applicazione di esempio viene eseguita localmente su https://localhost:7154/
Puoi trovare il codice di esempio generato dall'intelligenza artificiale in: https://github.com/ITfoxtec/dotnet.samples/tree/main/WebAppPasswordLessEmailAI
Configurare l'applicazione web in FoxIDs
Ora che conosciamo l'indirizzo locale dell'applicazione web, possiamo registrarla in FoxIDs in modo che possa autenticare gli utenti tramite OpenID Connect.
- Seleziona la scheda Applicazioni nel tuo ambiente FoxIDs.
- Scegli Nuova applicazione, quindi seleziona Applicazione Web: OpenID Connect.
- Nel campo Nome, inserisci un nome, ad esempio: ASP.NET applicazione web.
- Nell'URI di reindirizzamento, aggiungi l'indirizzo di base dell'applicazione: https://localhost:7154/ Per impostazione predefinita, FoxIDs consente il reindirizzamento a qualsiasi pagina successiva sotto questo URL di base. Se preferisci una convalida più rigorosa, puoi richiedere URI di reindirizzamento assoluti.
- Fare clic su Crea.
FoxIDs ora visualizza i dettagli di connessione per la tua nuova applicazione, tra cui:
- Authority
- ID cliente
- Segreto del cliente
Copia Authority e ID cliente nella sezione IdentitySettings del progetto. Archivia il Segreto client nei segreti utente .NET localmente o in una variabile di ambiente protetta o in un archivio segreto in produzione.
Configurare l'autenticazione nell'applicazione ASP.NET
Una volta creata l'applicazione FoxIDs, il passaggio successivo è configurare l'autenticazione nel progetto ASP.NET Core.
Aggiungi i dettagli della connessione FoxIDs non segreti a appsettings.json:
{
"IdentitySettings": {
"Authority": "https://foxids.com/{tenant}/{environment}/{application}/",
"ClientId": "your-client-id"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
Archivia il segreto client localmente senza aggiungerlo a appsettings.json:
dotnet user-secrets init
dotnet user-secrets set "IdentitySettings:ClientSecret" "your-client-secret"
Sostituisci i valori di esempio con quelli del tuo ambiente FoxIDs e non eseguire mai il commit del segreto client reale.
Login
Fai clic su Accedi e verrai reindirizzato alla schermata di accesso FoxIDs.
Seleziona Crea utente.
Compila il modulo Crea utente con il tuo indirizzo email (o un'email di prova a cui hai accesso), nome e cognome, quindi fai clic su Crea.
Inserisci la password monouso (OTP) che hai ricevuto via email, quindi fai clic su Accedi.
Hai effettuato l'accesso e vengono visualizzate i claims del tuo utente di prova.
Successivamente, prova a disconnetterti e ad accedere nuovamente per sperimentare il flusso di accesso senza password utilizzando l'e-mail OTP.